获取Django中查询对象的外键值

时间:2014-05-22 16:04:17

标签: python mysql sql django

我的搜索查询如下:

ct = Classified.objects.filter(
    Q(name__icontains=q) |
    Q(subcategory__parent__type__icontains=q) |
    Q(address__area__icontains=q) |
    Q(subcategory__name__icontains=q)
).filter(active__icontains='yes').filter(address__city__name__exact=cit)
分类模型

class Classified(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=256)
    contact_person = models.CharField(max_length=300)
    email = models.CharField(max_length=100)
    address = models.ForeignKey(Address)
    subcategory = models.ForeignKey(Subcategory)
    phone_number = models.BigIntegerField(max_length=20, default=0)
    image = models.ImageField(blank=True, upload_to='dynamic/img/')
    NO = 'NO'
    YES = 'YES'
    APPROVAL = ((NO, 'no'), (YES, 'yes'))
    active = models.CharField(choices=APPROVAL, default=NO, max_length=3)
    verified = models.CharField(choices=APPROVAL, default=NO, max_length=3)

    def __unicode__(self):
        return self.name

子类别模型是:

class Subcategory(models.Model):
    id = models.AutoField(primary_key=True)
    parent = models.ForeignKey(Categories, null=True, blank=True, default=1)
    name = models.CharField(max_length=300)

    def __unicode__(self):
        return self.name

此处不涉及“类别”表,因此我未将其包括在内。

在视图中,我显示了一个过滤器下拉列表,该下拉列表应显示ct中找到的结果的所有唯一子类别的列表。

我尝试了两种解决方案:

getsubcat = Classified.objects.filter(
    Q(name__icontains=q) | 
    Q(subcategory__parent__type__icontains=q) | 
    Q(address__area__icontains=q) | 
    Q(subcategory__name__icontains=q)
).filter(active__icontains='yes').\
    filter(address__city__name__exact=cit).values('subcategory')

这给了我一个包含所有子类别的列表:{'subcategory': 1},{'subcategory':2}。但是,这不是我需要的,因为我需要Subcategory.name中结果的确切ct

我在模板中尝试了第二种方法:

{% for subcat in result %}
   {{ subcat.subcategory.name }}
{% endfor %}

其中result从views.py传递为{ 'result': ct, }。然而,这会重复相同的子类别n次,其中nresult中的结果数。

2 个答案:

答案 0 :(得分:1)

如果您需要子类别,则应查询子类别。

Subcategory.objects.filter(classified__in=ct)

答案 1 :(得分:1)

我认为您可以使用values_list仅返回subcategory__name

尝试类似

的内容
subcategories = ct.values_list('subcategory__name', flat=True).distinct()