【问题标题】:Django REST Framework filter by Foreign keyDjango REST Framework 按外键过滤
【发布时间】:2021-06-25 11:22:30
【问题描述】:

首先,请考虑到我是Django 的新手,所以我不太确定自己在寻找什么。

我有一个模型叫Product

class Product(models.Model):
   name = models.CharField('Name', max_length=100)
   ...

一个Product 可以有多个变体,所以我创建了另一个名为ProductVariant 的模型,它有一个ForeignKeyProduct

class ProductVariant(models.Model):
   name = models.CharField('Name', max_length=100)
   product = models.ForeignKey(Product,
                            verbose_name='Produkt',
                            related_name='productvariants',
                            on_delete=models.CASCADE)
...

我只想退回具有变体的产品,但我不知道如何从Product FilterProduct Serializer 访问该信息,因为ForeignKey 位于ProductVariant 模型上。

有什么想法吗?我知道这是基本的 Django,但我是全新的,任何帮助将不胜感激。

这是我的Product Filter:

class ProductFilter(filters.FilterSet):

class Meta:
    model = Product
    fields = ['id', 'name']

Product Serializer:

class ProductSerializer(serializers.ModelSerializer):

    class Meta:
       model = Product
       fields = ('id', 'name')

Product ViewSet:

class ProductViewSet(ModelViewSet):
   queryset = Product.objects.all()
   filterset_class = ProductFilter
   serializer_class = ProductSerializer
   permission_classes = [IsAuthenticated]

【问题讨论】:

    标签: django django-rest-framework django-filter


    【解决方案1】:

    您可以通过更改 queryset 字段来控制 ModelView 响应中的内容。如果您只想查看那些具有变体的Products,请尝试过滤那些具有非Nonename 字段的变体(如果有,它将有一个值)。

    class ProductViewSet(ModelViewSet):
       queryset = Product.objects.filter(productvariants__name__isnull=False).distinct()
       filterset_class = ProductFilter
       serializer_class = ProductSerializer
       permission_classes = [IsAuthenticated]
    

    我添加了一个.distinct() 调用,这样每个Product 只出现一次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-12
      • 1970-01-01
      • 1970-01-01
      • 2014-02-26
      • 2013-09-04
      • 2020-03-09
      • 1970-01-01
      • 2013-10-24
      相关资源
      最近更新 更多