У меня есть 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)
Спасибо за любые подсказки.
Отлично работает :) Спасибо. – jundymek