我对模型序列化器有问题。 我的模特
class ItemState(models.Model):
"""Status for a item"""
name = models.CharField(max_length=255, null=True, blank=True)
class Item(models.Model):
title = models.CharField(max_length=255)
status = models.ForeignKey(ItemState, on_delete=models.CASCADE)
我的序列化器:
class ItemStateSerializer(serializers.ModelSerializer):
class Meta:
model = ItemState
fields = '__all__'
class ItemSerializer(serializers.ModelSerializer):
status = ItemStateSerializer(read_only=True)
class Meta:
model = Item
fields = '__all__'
还有我的观点
class ItemViewSet(viewsets.ModelViewSet):
""" Item view set """
queryset = Item.objects.all()
serializer_class = ItemSerializer
permission_classes = (IsOwnerOrAdmin, )
我的问题是,如何在不创建状态对象的情况下进行放置或发布? 我想替换这个
HTTP PUT
{
"title": "example",
"status": {
"id": 1,
"name": "hello"
}
}
以此
HTTP PUT
{
"title": "example",
"status": 1
}
感谢社区!
答案 0 :(得分:0)
您想保留其他班级还是可以一起摆脱所有课程?似乎更简单:
class Item(models.Model):
title = models.CharField(max_length=255)
status = models.CharField(max_length=255) # or you can change to int if you want
答案 1 :(得分:0)
您可以将两个序列化器字段用于同一模型字段-一个用于详细信息,另一个默认使用id(see this answer)。因此,在您的情况下,您的序列化器可以定义为:
[HttpPost]
public IActionResult Create(ContactEntityModels model)
{
newContact.firstname = model.firstname;
var contact = new Entity("contact");
{
contact["firstname"] = newContact.firstname;
contact["parentcustomerid_account"] = newContact.ParentAccount;
}
_crmContext.ServiceContext.AddObject(contact);
_crmContext.ServiceContext.SaveChanges();
return RedirectToAction("Contacts", "Admin");
}
现在,您的PUT请求将如您所愿:
class ItemSerializer(serializers.ModelSerializer):
status_detail = ItemStateSerializer(source='status', read_only=True)
class Meta:
model = Item
fields = '__all__'
但是当您获取HTTP PUT
{
"title": "example",
"status": 1
}
时,它将在Item
字段中包含ItemState
的详细信息:
status_detail