python - 是否有任何选项可以按 django python 中的模型文件过滤数据?
问题描述
我是Django新手,有没有选择显示数据的选项?我可以按类别过滤,但我必须按选项或模型的字段进行过滤。或者是否有任何选项可以在一个模板中使用多个过滤器?或者我们可以在一个模型中使用两个外键进行过滤吗?这是我的产品模型,我在其中使用了过滤器的归档(成员),但我不能这样做,然后我使用了另一个模型作为过滤器。
class Product(models.Model):
MEMBER = (
('For Kids', 'For Kids'),
('For Lover', 'For Lover',),
('For Teacher', 'For Teacher'),
('For Boss', 'For Boss'),
)
category = models.ForeignKey(Category, related_name='products', on_delete=models.PROTECT)
member = models.CharField(max_length=200,choices = MEMBER)
title = models.CharField(max_length=200, db_index=True)
slug = models.SlugField(max_length=200, db_index=True)
image = models.ImageField(upload_to='products/%d/%m/%Y', blank =True)
description = models.TextField(blank=True)
price = models.IntegerField(default=0)
stock = models.PositiveIntegerField()
available = models.BooleanField(True)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
class Meta:
ordering = ('-title',)
index_together = (('id','slug'),)
def __str__(self):
return self.title
和我的类别模型:
class Category(models.Model):
title = models.CharField(max_length=200, db_index=True)
slug = models.SlugField(max_length=200, db_index=True, unique=True)
image = models.ImageField(upload_to='products/%d/%m/%Y', blank =True)
parent = models.ForeignKey('self',blank=True, null=True ,related_name='children', on_delete=models.PROTECT)
class Meta:
unique_together = ('slug', 'parent',)
ordering = ('title',)
verbose_name = 'category'
verbose_name_plural = 'categories'
视图.py
def eventmore(request,id,slug):
products = None
categories = Category.get_all_categories()
categoryID = request.GET.get('category')
if categoryID:
products = Product.get_all_products_by_categoryid(categoryID)
else:
products = Product.get_all_products()
data = {}
data['products'] = products
data['categories'] = categories
return render(request, 'events-more.html', data)
我该怎么做才能按选择(成员)过滤或如何制作嵌套类别或按嵌套过滤数据?
解决方案
在这里您可以找到您需要的所有信息https://docs.djangoproject.com/en/3.1/topics/db/queries/是的,您可以过滤多次和/或使用多个参数。例如:
data_entries = Data.objects.filter(name='max', age=10).filter(email='max@gmail.com')
或者
data_entries = Data.objcets.filter(name='max')
data_entires = data_entries.filter(age=10, email='max@gmail.com')
将产生相同的结果。
在您的情况下,只需使用常规文本值对其进行过滤:
category = Category.objcets.get(pk=pk)
product = Product.objects.filter(member='For Kids', category=category)