【问题标题】:Filtering Foreign key choices in Django serializer在 Django 序列化程序中过滤外键选择
【发布时间】:2021-12-28 10:29:36
【问题描述】:

我有一个类似于下面代码的 Django 模型。目前,当我使用 django rest 框架创建一个新的菜单实例时,dish 列包含平台上所有用户创建的选项。 我应该如何过滤菜列,以便它只有用户创建的选项? 我应该在视图还是序列化程序中这样做?

感谢您提前回复。

class Dish(models.Model):
    user = models.ForeignKey(
        User, on_delete=models.CASCADE, null=True, blank=True)
    title = models.CharField(max_length=280)
    description = models.CharField(max_length=280)
    image = models.ImageField(upload_to='static/images/post_image',
                              default='static/images/post_image/default.jpg')

    def __str__(self):
        return f'{self.title}'

    def get_image_url(self, obj):
        return obj.image.url


class Menu(models.Model):
    user = models.ForeignKey(
        User, on_delete=models.CASCADE, null=True, blank=True)
    title = models.CharField(max_length=280)
    description = models.CharField(max_length=280)
    dish = models.ManyToManyField(Dish)
    price = models.SmallIntegerField(
        validators=[MinValueValidator(1), MaxValueValidator(10000)], default=None)

    def __str__(self):
        return f'{self.title}'

这就是我最终为那些将来遇到同样问题的人做的事情。


class UserDishForeignKey(serializers.PrimaryKeyRelatedField):
    def get_queryset(self):
        user = self.context['request'].user
        return Dish.objects.filter(user=user)


class MenuCreateSerializer(serializers.ModelSerializer):
    dish = UserDishForeignKey(many=True)

    class Meta:
        model = Menu
        fields = ['title', 'description', 'dish', 'price', ]
        read_only_fields = ['user', ]

    def get_user(self, obj):
        return str(obj.user.username)

【问题讨论】:

  • 我建议通过使用下面Tuomo的答案修改get_queryset()方法在视图中进行。

标签: python django django-rest-framework


【解决方案1】:

假设您有一个user 对象,您可以像这样获取与该user 关联的所有菜肴:

user.dish_set

如果您想查找所有具有特定菜单的菜主的菜单。可以这样做

Menu.objects.filter(dish__user=user)

这取决于您要达到的目标。如果要验证输入,则放置应在序列化程序中

【讨论】:

    【解决方案2】:
    class UserDishForeignKey(serializers.PrimaryKeyRelatedField):
        def get_queryset(self):
            user = self.context['request'].user
            return Dish.objects.filter(user=user)
    
    
    class MenuCreateSerializer(serializers.ModelSerializer):
        dish = UserDishForeignKey(many=True)
    
        class Meta:
            model = Menu
            fields = ['title', 'description', 'dish', 'price', ]
            read_only_fields = ['user', ]
    
        def get_user(self, obj):
            return str(obj.user.username)
    

    【讨论】:

      猜你喜欢
      • 2018-12-13
      • 1970-01-01
      • 1970-01-01
      • 2021-02-13
      • 2015-03-27
      • 2020-03-21
      • 1970-01-01
      • 2014-04-18
      • 2019-01-19
      相关资源
      最近更新 更多