Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否为反向关系查找实现django filter MultipleModelChoiceField?_Python_Django_Django Filter - Fatal编程技术网

Python 是否为反向关系查找实现django filter MultipleModelChoiceField?

Python 是否为反向关系查找实现django filter MultipleModelChoiceField?,python,django,django-filter,Python,Django,Django Filter,我一直在为我的一个项目使用django过滤器。根据文档,我已经为我的产品型号实施了产品过滤器(颜色和材质)。但经过多次尝试,我仍然无法实现另一个表ProductSize中的产品尺寸反向查找 models.py class Product(models.Model): product_name = models.CharField(max_length=500) product_color = models.ForeignKey(Colour,related_name='produ

我一直在为我的一个项目使用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
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']
def product_view(request):
    product=Product.objest.all()
    f = ProductMaterialFilter(request.GET, queryset=product)
    context={'filter':f,}
    return render(request,'product.html',context)
过滤器.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
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']
def product_view(request):
    product=Product.objest.all()
    f = ProductMaterialFilter(request.GET, queryset=product)
    context={'filter':f,}
    return render(request,'product.html',context)
视图.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
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']
def product_view(request):
    product=Product.objest.all()
    f = ProductMaterialFilter(request.GET, queryset=product)
    context={'filter':f,}
    return render(request,'product.html',context)
Django版本:

django versions==1.10.8
django-filter==1.1.0
我需要知道根据
ProductSize
模型的
ProductFilter
的“值”进行大小筛选的步骤

任何帮助都将不胜感激。

models.py

from django.db import models


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


class Size(models.Model):
    value = models.CharField(unique=True, max_length=4)

    def __unicode__(self):
        return self.value


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 "{} ({}, {})".format(self.product_name, self.product_color, self.product_material)


class Stock(models.Model):
    product = models.ForeignKey('Product', related_name='details')
    size = models.ForeignKey('Size')
    stock = models.IntegerField(default=1)
    items_sold = models.IntegerField(default=0)
    description = models.TextField(blank=True)

    def __unicode__(self):
        return "{product_name}({material}, {color}) @size: {size}, available {available} out of: {stock}".format(
            product_name=self.size.value,
            material=self.product.product_material.material,
            color=self.product.product_color.colour,
            size=self.size.value,
            available=self.stock-self.items_sold,
            stock=self.stock
        )
过滤器.py

import django_filters
from django import forms

from products.models import Material, Colour, Stock, Size


class ProductFilter(django_filters.FilterSet):
    product__product_material = django_filters.ModelMultipleChoiceFilter(
        queryset=Material.objects.all(),
        widget=forms.CheckboxSelectMultiple
    )
    product__product_color = django_filters.ModelMultipleChoiceFilter(
        queryset=Colour.objects.all(),
        widget=forms.CheckboxSelectMultiple
    )

    size = django_filters.ModelMultipleChoiceFilter(
        queryset=Size.objects.all(),
        widget=forms.CheckboxSelectMultiple
    )

    class Meta:
        model = Stock
        fields = ['product__product_color', 'product__product_material', 'size']
演示:


value=models.CharField(最大长度=50)
代表尺寸?这是糟糕的数据设计,我认为…请告诉我如何更好的设计可以考虑库存的产品更新为一个特定的大小。我疯狂的快速更新。问题是关于过滤,而不是db设计。看看我喜欢你们的设计。但这在我的情况下是不可能的,因为它已经在生产中,这种规模的改变将需要改变许多应用程序的代码库,如购物车、订单、cms等。也许我应该尝试在视图中编写自定义逻辑,以使大小筛选成为可能。非常感谢您的时间和建议。我将努力为即将到来的项目设计更好的设计,以避免这些障碍。