2016-04-20 9 views
0

3つのテーブルからフィールドをフィルタリングしようとしています。 私はリストとして1テーブルを、条件付きで2テーブルを結合する必要があります。 私はDjangoの1.9.4は、MySQL 5.6.17Django 1.9.4条件付き3つのモデルでmany-to-oneフィルタリング

を持っている。これは私のmodels.pyである:私はすべての製品を取得する必要がある

class Products(models.Model): 
    fullname = models.CharField(max_length=250, db_index=True) 
    code  = models.CharField(max_length=15, db_index=True, null=True) 
    authors  = models.CharField(max_length=300, db_index=True, null=True) 
    ... 
    def __str__(self): 
     return self.fullname 

class Barcodes(models.Model): 
    product  = models.ForeignKey(Products, on_delete=models.CASCADE) 
    barcode  = models.CharField(max_length=25, db_index=True, null=True) 
    def __str__(self): 
     return self.barcode 

class Prices(models.Model): 
    product  = models.ForeignKey(Products, on_delete=models.CASCADE) 
    price  = models.FloatField(default=0) 
    shop_id  = models.IntegerField(default=0) 
    shop_name = models.CharField(max_length=50, null=True) 
    def __str__(self): 
     return self.shop_name 

、GROUP_CONCAT(個別のバーコード)に入社し、shop_id = 1と価格に入社し、

def get_queryset(self): 
    return Products.objects.values('id', 'fullname', 'authors', 'code', 'theme').annotate(barcodes=Concat('barcodes__barcode')) 

をさらに集約関数を使用します: - 価格の文字列が存在しない場合は、戻り価格= 0

私はそのようにした

class Concat(Aggregate): 
    function = 'GROUP_CONCAT' 
    template = '%(function)s(%(distinct)s%(expressions)s)' 
    def __init__(self, expression, distinct=False, **extra): 
     super(Concat, self).__init__(
      expression, 
      distinct='DISTINCT ' if distinct else '', 
      output_field=models.CharField(), 
      **extra) 

shop_id = 1で価格を追加するにはどうすればよいですか?

ありがとうございました。

答えて

0
from django.db.models import Q 

... 

def get_queryset(self): 
    return Products.objects.filter(Q(prices__shop_id=1) | Q(prices__shop_id__isnull=True)).values('id', 'fullname', 'authors', 'code', 'tema', 'prices__price').annotate(barcodes=Concat('barcodes__barcode', True)) 
関連する問題