首页 > 解决方案 > DRF 更新对象的嵌套外键

问题描述

我已经试图把我的头绕太久了:(我的前端需要以下输出(特别是ID&name字段的组合):

{“序列”:“e3461fb0”,“装运”:{“id”:1,“名称”:“通过鹿特丹”}}

模型:

class Shipment(models.Model):
    name = models.CharField("name", max_length = 128)
    date = models.DateField()

class Product(models.Model):
    serial = models.CharField("serial", max_length = 31, unique = True)
    shipment = models.ForeignKey(Shipment, on_delete = models.CASCADE, blank = True, null = True)

序列化器:

class ShipmentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Shipment
        fields = ["id", "name",]
        
class ProductSerializer(serializers.ModelSerializer):
    shipment = ShipmentSerializer()

    def update(self, instance, validated_data):
        print("TEST:", instance, validated_data)
        return super().update(instance, validated_data)

    class Meta:
        model = Product
        fields = ["serial", "shipment",]    
        lookup_field = "serial"
        read_only_fields = ["serial",]

视图集:

class ProductViewSet(ModelViewSet):
    serializer_class = ProductSerializer
    lookup_field = "serial"
    http_method_names = ["get", "patch", "put"]

    def get_queryset(self):
        return Product.objects.all()

我的问题如下:假设一个产品链接到一个货件,我现在想要的是通过使用id. name但即使在DRF的 HTML 视图中,我也只能看到shipment. 我怎样才能只显示/使用id这里?我知道我可以修改__str__模型的方法以返回字符串表示形式并稍后在前端拆分它,但如果可能的话我想避免这种情况。

在此处输入图像描述

我在想这样的事情:

在此处输入图像描述

标签: djangodjango-rest-frameworkdjango-serializer

解决方案


id字段是DRF自己做的,默认是只读的

如果你想更新它,你应该覆盖这个字段。就像是:

class ShipmentSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField()
    name = serializers.CharField(read_only=True)

    class Meta:
        model = Shipment
        fields = ["id", "name",]

推荐阅读