如何构造一个过滤列表中每个元素的Django查询?

时间:2015-02-12 20:40:53

标签: django django-queryset

我正在尝试构建一个查询,该查询以当前登录的用户最近的列表为5个邮政编码列表,然后筛选出与这5个邮政编码匹配的所有待售商品。

models.py

class MyProfile(UserenaBaseProfile):
    user = models.OneToOneField(User,
                                unique=True,
                                verbose_name=_('user'),
                                related_name='my_profile')
    streetaddress=models.CharField(null=True, blank=True, max_length=30)
    city = models.CharField(null=True, blank=True, max_length=20)
    state = models.CharField(null=True, blank=True, max_length=20)
    zipcode = models.IntegerField(_('zipcode'),
                                       max_length=5, null=True, blank=True)
    nearestzips = models.Charfield(null=True, blank=True, max_length=80)

views.py

class Entry(models.Model):
    headline= models.CharField(max_length=200,)
    body_text = models.TextField()
    author=models.ForeignKey(settings.AUTH_USER_MODEL, related_name='entryauthors')
    pub_date=models.DateTimeField(auto_now_add=True)
    zipcode =models.IntegerField(null=True, max_length=10)

从控制台打印最近的

print testprofile.nearestzips
>>>[<PostalCode=97202>, <PostalCode=97201>, <PostalCode=97215>, <PostalCode=97239>, <PostalCode=97214>]

最后,这是我想要构建的查询。

latest_entries = Entry.objects.filter(zipcode="user.nearestzips")

我的问题是,由于nearestzips是一个列表,我如何过滤该列表的5个元素?我可以在&#39; nearestzipcodes&#39;之后简单地添加[0:4]。或者我必须做这样的事情:

latest_entries = Entry.objects.filter(zipcode="user.nearestzips[0]").filter(zipcode="user.nearestzips[1]").filter(zipcode="user.nearestzips[3]"), etc.

感谢任何帮助,谢谢。

2 个答案:

答案 0 :(得分:0)

由于nearestzips是一个字符串,因此您需要首先解析MyProfile.nearestzips以获得正确的列表。如果您已在某处执行此操作,则查询非常简单:

zip_list = user.nearestzips # Assuming this returns a proper list
latest_entries = Entry.objects.filter(zipcode__in=zip_list)

如果user.nearestzips没有返回列表,您可以向MyProfile对象添加自定义方法以返回列表格式的邮政编码:

def get_nearestzips(self, *args, **kwargs):
    zip_list = self.nearestzips.replace("PostalCode=","")
    return zip_list.split(",")

答案 1 :(得分:0)

您可以在django中使用__in字段查找。 https://docs.djangoproject.com/en/1.7/ref/models/querysets/#in

语法为filter(col_name__in = list)。由于您的输入是字典,因此您必须使用list.values()函数为“in”过滤器输入生成数据。

所以放在一起:

nearby_entry = Entry.objects.filter(zipcode__in=testprofile.nearestzips.values())

更新Feb13: 如果您最近的是一个查询集,那么您必须将其转换为列表或使用values_list来获取数据。

方法1:转换

  

zip_list = [z testposof.nearestzips中的z.postalcode]

方法2:values_list假设nearestzips是一个many2many字段

  

zip_list = testprofile.nearestzips.values_list('postalcode',   平= TRUE)