我正在尝试构建一个查询,该查询以当前登录的用户最近的列表为5个邮政编码列表,然后筛选出与这5个邮政编码匹配的所有待售商品。
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)
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.
感谢任何帮助,谢谢。
答案 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)