2015-02-12 2 views
0

Я пытаюсь построить запрос, который принимает в настоящее время зарегистрированных пользователей nextzips, который является списком из 5 почтовых кодов, а затем фильтрует все товары для продажи, которые соответствуют этим 5 почтовым индексам.Как создать запрос Django, который фильтрует каждый элемент списка?

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) 

печати nearestzips из консоли

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

И, наконец, вот запрос я пытаюсь построить.

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

Мой вопрос в том, что ближайший список - это список, как я могу фильтровать через 5 элементов этого списка? Могу ли я просто добавить [0: 4] после того, как «nearestzipcodes» или я должен сделать что-то вроде этого:

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

Любая помощь будет apprecitaed, спасибо.

ответ

0

Поскольку ближайший цикл - это строка, вам нужно сначала разобрать 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(",") 
0

Вы можете использовать поиск поля __in в django. https://docs.djangoproject.com/en/1.7/ref/models/querysets/#in

Синтаксис - это фильтр (col_name__in = list). Поскольку ваш ввод - это словарь, вы должны использовать функцию list.values ​​() для генерации данных для вашего входного фильтра.

Так поставить все вместе:

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

Update Feb13: Если nearestzips является QuerySet, то вы должны либо преобразовать его в список или использовать values_list для получения данных вместо этого.

Method1: конвертировать

zip_list = [z.postalcode for z in testprofile.nearestzips]

method2: values_list предполагая nearestzips является many2many полю

zip_list = testprofile.nearestzips.values_list('postalcode', flat=True)

+0

Это дает мне TypeError: не может использовать многопрофильное geovaluesqueryset в качестве значения fiilter. – stephan

+0

Я не знаю, вызвала ли это причину проблемы, но с помощью этой строки была создана следующая информация: ближайшее zips = PostalCode.objects.distance (PostalCode.objects.get (code = 'user.zipcode'). Location) .order_by ('distance') [: 9] – stephan

+0

Можно ли использовать __in с django 1.6? – stephan

Смежные вопросы