django - 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__
模型的方法以返回字符串表示形式并稍后在前端拆分它,但如果可能的话我想避免这种情况。
我在想这样的事情:
解决方案
id字段是DRF自己做的,默认是只读的
如果你想更新它,你应该覆盖这个字段。就像是:
class ShipmentSerializer(serializers.ModelSerializer):
id = serializers.IntegerField()
name = serializers.CharField(read_only=True)
class Meta:
model = Shipment
fields = ["id", "name",]
推荐阅读
- gis - 如何在 QGIS Server 中显示图层组
- java - 如何使用 JAVA 在 XML 中设置属性值
- python - 如何将函数输出添加到文本文件中?
- c - 为什么我的程序不能正确地将十进制转换为二进制打印?
- jquery - 出现错误:“无法读取未定义的属性 'toLowerCase'”在 filter() 函数中使用 Jquery find()
- sql - 需要在 ssis 中使用从其他查询返回 5 个随机行结果的查询
- python - 如何根据可变数量显示和保存django表单的多个实例?
- scala - 为什么scala枚举不从其他枚举中选择值作为其值?
- xml - 如何使用 ORACLE 解析 XML 中的属性值
- azure-application-insights - APIM 在 Azure Application Insights 中屏蔽 PII 数据