2017-01-30 5 views
0

У меня есть Site.model с имеет категории, значения category1: сайта A: - category1 - category2 сайта B: - category1 - category3Джанго - фильтр объектов (несколько категорий одной и той же модели)

Я хотел бы фильтровать объекты в определенной категории, чтобы показывать только связанные сайты (например, в категории 1 должны быть сайты А и Сайт Б, в категории 3 - только сайт Б). Теперь мой код выглядит следующим образом:

class SiteList(): 

    def __init__(self, category_slug, subcategory_slug=None): 
     self.cat_slug = category_slug 
     self.subcat_slug = subcategory_slug 

    def get_context(self): 
     context = {} 
     if self.subcat_slug is None: 
      category = Category.objects.get(slug=self.cat_slug) 
      sites = Site.objects.filter(category=category, is_active=True) 
      subcategory = SubCategory.objects.values().filter(category=category) 
     else: 
      category = Category.objects.get(slug=self.cat_slug) 
      subcategory = SubCategory.objects.filter(category=category 
                ).get(slug=self.subcat_slug) 
      sites = Site.objects.filter(subcategory=subcategory, is_active=True) 
     context['subcategory'] = subcategory 
     print(subcategory) 
     context['category'] = category 
     context['sites'] = sites 
     return context 

Можно ли написать что-то вроде ??:

sites = Site.objects.filter(category=category or category1=category, is_active=True) 

я не имею ни малейшего представления, как можно фильтровать сайты для правильного отображения объектов.

Это моя модель сайта:

class Site(models.Model): 
    category = models.ForeignKey('Category') 
    subcategory = ChainedForeignKey(
     'SubCategory', 
     chained_field='category', 
     chained_model_field='category', 
     show_all=False, 
     auto_choose=True) 
    name = models.CharField(max_length=70) 
    description = models.TextField() 

    keywords = MyTextField() 
    date = models.DateTimeField(default=datetime.now, editable=False) 
    url = models.URLField() 
    is_active = models.BooleanField(default=False) 

    category1 = models.ForeignKey('Category', related_name='category', blank=True, null=True) 
    subcategory1 = ChainedForeignKey(
     'SubCategory', 
     chained_field='category1', 
     chained_model_field='category', 
     related_name='subcategory', 
     show_all=False, 
     auto_choose=True, blank=True, null=True) 

    group = models.CharField(max_length=10, choices=(('podstawowy', 'podstawowy'), 
                ('premium', 'premium')), default='podstawowy') 

    def get_absolute_url(self): 
     return reverse('site', args=[str(self.category.slug), 
            str(self.subcategory.slug), str(self.id)]) 

    def get_thumb(self): 
     host = urlparse(self.url).hostname 
     if host.startswith('www.'): 
      host = host[4:] 
     thumb = 'http://free4.pagepeeker.com/v2/thumbs.php?size=s&url=' + host 
     return thumb 

    class Meta: 
     verbose_name_plural = "Strony" 

    def __str__(self): 
     return self.name 

и мой взгляд Категория:

def category(request, category_slug): 
    context = {} 
    try: 
     context = SiteList(category_slug).get_context() 
     # tagi dla kategorii 
     tags = Tags(category_slug).all_tags() 
     context['tags'] = tags 
    except Category.DoesNotExist: 
     raise Http404("There is no such category") 
    return render(request, 'mainapp/category.html', context) 

Спасибо за любые подсказки.

ответ

1

Можно ли написать что-то вроде ??:

sites = Site.objects.filter(category=category or category1=category, is_active=True) 

Да, использовать Q объект, когда вы хотите использовать or:

Если вам нужно выполнить более сложные запросы (например, запросы с OR заявления), вы можете использовать Q объектов.

Q объект (django.db.models.Q) представляет собой объект, используемый для инкапсуляции коллекции ключевых аргументов. Эти аргументы ключевых слов указаны в разделе «Поиск по полю» выше.

from django.db.models import Q 
sites = Site.objects.filter(
    Q(category=category) | Q(category1=category), 
    is_active=True) 
+0

Отлично работает :) Спасибо. – jundymek

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