Django 限制DRF中外键的选择

Django 限制DRF中外键的选择,django,django-rest-framework,Django,Django Rest Framework,我有模型商品: class Commodity(models.Model): shop = models.ForeignKey(Shop, related_name='commodity', on_delete=models.CASCADE) brand = models.ForeignKey(Brand, blank=True, null=True, on_delete=models.CASCADE) price_old = models.DecimalField(ma

我有模型商品:

class Commodity(models.Model):
    shop = models.ForeignKey(Shop, related_name='commodity', on_delete=models.CASCADE)
    brand = models.ForeignKey(Brand, blank=True, null=True, on_delete=models.CASCADE)
    price_old = models.DecimalField(max_digits=10, decimal_places=2)
    price_new = models.DecimalField(max_digits=10, decimal_places=2)
我尝试使用
将选项限制为
,但没有成功。
我有一个序列化程序:

class CommoditySerializer(serializers.ModelSerializer):
    image = CommodityImageSerializer(many=False)

    def get_queryset(self):
        user = self.context['request'].user
        queryset = Commodity.objects.filter(shop__company__user=user)
        return queryset

    class Meta:
        model = Commodity
        fields = ('id', 'shop', 'brand', 'price_old', 'price_new')
这也帮不了我。 最后我有了一个常规的CreateAPIView,这个方法也帮不了我。
如何限制外键的使用?我需要让我的用户创建商品只在用户的商店。谢谢

我想您可以简单地实现此方法:

class CommoditySerializer(serializers.ModelSerializer):
    image = CommodityImageSerializer(many=False)

    def validate_shop(self, value):
        user = self.context['request'].user
        if value.company.user == user:
            return value
        raise serializers.ValidationError('Invalid shop!')

    class Meta:
        model = Commodity
        fields = ('id', 'shop', 'brand', 'price_old', 'price_new')

我认为这是一种将所有最终验证留给前端的好做法,对吗?(我的意思是所有用户看不到但可以使用的商店)@D.Make no,在前端保留验证根本不是一个好做法。在您的情况下,您应该先在后端筛选商店,然后再将其返回到前端。@newerwinner我想知道您的答案。序列化程序验证允许fronend获得所有商店的列表,并且不允许选择非用户商店。是否可以,后端显示完整的商店列表,即使是那些用户不能使用的商店?@D.Make
CommoditySerializer
根本不返回商店对象。我不知道你在哪个视图中把商店发送到前端,但是过滤应该在那里执行。我是关于HTML表单的,它显示了我的选择。正如我现在所理解的,它只是为了测试而制作的,应该在开发之后关闭。当然,我有品牌过滤。谢谢