Я использую django-фильтры для одного из своих проектов. В соответствии с документацией я реализовал фильтр продуктов (для цветов и материалов) для своих моделей продуктов. Но после многих попыток я все еще не могу реализовать обратный поиск размеров продукта, который находится в другой таблице ProductSize.
models.py
class Product(models.Model):
product_name = models.CharField(max_length=500)
product_color = models.ForeignKey(Colour,related_name='productcolor')
product_material=models.ForeignKey(Material)
def __str__(self):
return self.product_name
class ProductSize(models.Model):
product=models.ForeignKey('Product',related_name='details')
value = models.CharField(max_length=50)
stock= models.IntegerField(default=1)
items_sold = models.IntegerField(default=0)
description = models.TextField(blank=True)
def __unicode__(self):
return self.value
class Colour(models.Model):
colour=models.CharField(max_length=100)
colour_code=models.CharField(max_length=100,null=True,blank=True)
def __unicode__(self):
return u'%s' %self.colour
class Material(models.Model):
material=models.CharField(max_length=100)
def __unicode__(self):
return u'%s' %self.material
filters.py
class ProductFilter(django_filters.FilterSet):
product_material=django_filters.ModelMultipleChoiceFilter(
queryset=Material.objects.all(),
widget=forms.CheckboxSelectMultiple
)
product_color=django_filters.ModelMultipleChoiceFilter(
queryset=Colour.objects.all(),
widget=forms.CheckboxSelectMultiple
)
class Meta:
model = Product
fields=['product_color','product_material']
views.py
def product_view(request):
product=Product.objest.all()
f = ProductMaterialFilter(request.GET, queryset=product)
context={'filter':f,}
return render(request,'product.html',context)
Версия Джанго:
django versions==1.10.8
django-filter==1.1.0
Мне нужно знать шаги для фильтрации размера по «значению» моделей ProductSize
для ProductFilter
.
Любая помощь приветствуется.
value = models.CharField(max_length=50)
обозначает размер? Я думаю, что это плохой дизайн данных... - person andilabs   schedule 15.03.2018