我有一个搜索查询,如下所示:
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
作为{ 'result': ct, }
从views.py中传递。但是,这重复了相同的子类别n
次,其中n
是result
中的结果数。 最佳答案
我认为您可以使用values_list
只返回subcategory__name
。
试试像这样的
subcategories = ct.values_list('subcategory__name', flat=True).distinct()
关于python - 获取Django中查询对象的外键值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23811964/