Python 使用嵌套对象Django Rest框架放置在ModelViewSet上
我正在用django rest框架构建一个API。我有这些模型:Python 使用嵌套对象Django Rest框架放置在ModelViewSet上,python,django,python-3.x,django-models,django-rest-framework,Python,Django,Python 3.x,Django Models,Django Rest Framework,我正在用django rest框架构建一个API。我有这些模型: class Organism(models.Model): name = models.CharField(max_length=255) address = models.ForeignKey(Address, on_delete=models.CASCADE) type = models.ForeignKey(Type, on_delete=models.CASCADE) class Address(
class Organism(models.Model):
name = models.CharField(max_length=255)
address = models.ForeignKey(Address, on_delete=models.CASCADE)
type = models.ForeignKey(Type, on_delete=models.CASCADE)
class Address(models.Model):
street = models.CharField(max_length=255, blank=True)
class Type(models.Model):
name = models.CharField(max_length=255, blank=True)
这是“我的模式”有机体的视图:
class OrganismViewSet(viewsets.ModelViewSet):
queryset = Organism.objects.all()
serializer_class = OrganismSerializer
pagination_class = StandardResultsSetPagination
filter_backends = (filters.SearchFilter, DjangoFilterBackend)
filter_class = OrganismFilter
search_fields = ('name')
和我的序列化程序:
class OrganismSerializer(serializers.ModelSerializer):
addresse = AddressSerializer()
type = TypeSerializer()
class Meta:
model = Organism
fields = '__all__'
def update(self, instance, validated_data):
// What I should write to do something "elegant"
让我们想象一下,当我得到我的生物体时,我有:
{
"address": {
"id": 1
"street": "test"
},
type: {
"id": 1,
"name": "type Organism"
},
"name":"TestTest",
}
因此,我试图通过发送以下消息来更新一个有机体(我想更改街道名称,但不想创建新对象并更改数据库中存在的类型:
{
"address": {
"id": 1
"street": "new name"
},
type: {
"id": 2,
"name": "new type"
}
"name":"TestTest",
}
事实上,我在方法更新的参数“validated_data”中没有对象的ID。
如果你们知道如何继续。。。提前谢谢。是不是因为您的模型中没有明确定义“id”,调用Is\u valid()会删除“id”字段?在这种情况下,您是否尝试在序列化程序中定义id=models.serializers.IntegerField(required=False)?好的,现在我在已验证的\u数据中有了id字段。是否存在自动检测嵌套对象ID已更改并在数据库中更新的机制?或者我应该将其与if instance.type.id!=验证的_data.pop('type')['id']?然后我执行Type.objects.get(id=xx)和instance.Type=new\u Type,最后是instance.save()。我觉得这样做很乏味。我很确定它不存在,你必须写你自己的方法。这类似于一个问题。