2015-05-04 101 views
1

我有关于Django查询模型的问题。我知道如何编写简单的查询,但我不熟悉两个表上的LEFT JOIN。所以你可以给我一些关于他的查询的建议,以便更好地理解DJango ORM。Django模型查询

查询

select 
    count(ips.category_id_id) as how_many, 
    ic.name 
from 
    izibizi_category ic 
left join 
    izibizi_product_service ips 
on 
    ips.category_id_id = ic.id 
where ic.type_id_id = 1 
group by ic.name, ips.category_id_id 

从这个查询我得到的结果:

How many | name 
0;"fghjjh" 
0;"Papir" 
0;"asdasdas" 
0;"hhhh" 
0;"Boljka" 
0;"ako" 
0;"asd" 
0;"Čokoladne pahuljice" 
0;"Mobitel" 
2;"Čokolada" 

的,我也跟他的Django的查询尝试:

a = Category.objects.all().annotate(Count('id__category',distinct=True)).filter(type_id=1) 

但没有结果。

我的模型:

models.py

class Category(models.Model): 
    id = models.AutoField(primary_key=True) 
    type_id = models.ForeignKey('CategoryType') 
    name = models.CharField(max_length=255) 


    def __str__(self): 
     return str(self.name) 


class Product_service(models.Model): 
    id = models.AutoField(primary_key=True) 
    name = models.CharField(max_length=255, blank=True, null=True) 
    selling_price = models.DecimalField(decimal_places=5, max_digits=255, blank=True, null=True) 
    purchase_price = models.DecimalField(decimal_places=5, max_digits=255, blank=True, null=True) 
    description = models.CharField(max_length=255, blank=True, null=True) 
    image = models.FileField(upload_to="/", blank=True, null=True) 
    product_code = models.CharField(max_length=255, blank=True, null=True) 
    product_code_supplier = models.CharField(max_length=255, blank=True, null=True) 
    product_code_buyer = models.CharField(max_length=255, blank=True, null=True) 
    min_unit_state = models.CharField(max_length=255, blank=True, null=True) 
    state = models.CharField(max_length=255, blank=True, null=True) 
    vat_id = models.ForeignKey('VatRate') 
    unit_id = models.ForeignKey('Units') 
    category_id = models.ForeignKey('Category') 

如果你culd帮助我在这个问题上。

回答

1

你应该在CATEGORY_ID字段中添加相关的名称,如:

category_id = models.ForeignKey('Category', related_name="product_services") 

,这样在你的查询,你可以这样做:

a = Category.objects.all().annotate(Count('product_services',distinct=True)).filter(type_id=1) 

,然后你可以访问单个数为:

a[0].product_services__count 
+0

谢谢你的回答。有用。 – marin