【发布时间】:2016-02-22 00:04:52
【问题描述】:
我对 Django 和 Django-REST 有点陌生,所以请多多包涵。也许答案在文档中,所以如果我错过了,请提前道歉。
目标:我想创建一个 EquipmentInfo 对象,其属性包括预先存在的外键(EquipmentType 和 EquipmentManufacturer)。
models.py
class EquipmentType(models.Model):
equipment_type = models.CharField(verbose_name="Equipment Type", max_length=50, unique=True)
def __unicode__(self):
return self.equipment_type
class EquipmentManufacturer(models.Model):
manufacturer_name = models.CharField(verbose_name="Manufacturer Name", max_length=50, unique=True)
def __unicode__(self):
return self.manufacturer_name
class EquipmentInfo(models.Model):
equipment_type = models.ForeignKey(EquipmentType, verbose_name="Equipment Type")
part_identifier = models.CharField(verbose_name="Machine ID (alias)", max_length=25)
manufacturer_name = models.ForeignKey(EquipmentManufacturer, verbose_name="Manufacturer Name")
serial_number = models.CharField(verbose_name="Serial Number", max_length=25)
date_of_manufacture = models.DateField(verbose_name="Date of Manufacture", default=date.today)
is_active = models.BooleanField(verbose_name="Is Active", default=True)
def __unicode__(self):
return self.part_identifier
序列化器.py
class EquipmentTypeSerializer(serializers.ModelSerializer):
class Meta:
model = EquipmentType
fields = ('id', 'equipment_type',)
class EquipmentManufacturerSerializer(serializers.ModelSerializer):
class Meta:
model = EquipmentManufacturer
fields = ('id', 'manufacturer_name',)
class EquipmentInfoSerializer(serializers.ModelSerializer):
class Meta:
model = EquipmentInfo
fields = ('id', 'equipment_type', 'part_identifier', 'manufacturer_name','serial_number', 'date_of_manufacture', 'is_active')
equipment_type = EquipmentTypeSerializer(many=False)
manufacturer_name = EquipmentManufacturerSerializer(many=False)
def create(self, validated_data):
equipment_type = validated_data.pop('equipment_type')
manufacturer_name = validated_data.pop('manufacturer_name')
equipment_info = EquipmentInfo.objects.create(**validated_data)
return equipment_info
假设我已经创建了相关的 EquipmentType 和 EquipmentManufacturer 对象,我想添加另一个 EquipmentInfo 对象。什么是设置我的 EquipmentInfo 序列化程序的合适方法,以便我可以传递诸如
之类的信息{
"equipment_type":{
"equipment_type":"already_created",
},
"part_identifier":"something_new",
"manufacturer_name":{
"manufacturer_name":"already_created"
},
"serial_number":"WBA1",
"date_of_manufacture": "1900-01-01",
"is_active":true
}
甚至更好:
{
"equipment_type":"already_created",
"part_identifier":"something_new",
"manufacturer_name":"already_created",
"serial_number":"WBA1",
"date_of_manufacture": "1900-01-01",
"is_active":true
}
感谢任何帮助。
【问题讨论】:
-
你能澄清一下吗?问题是您希望在获取时能够获取嵌套的序列化程序,但在发布时,您只想传递现有对象的记录 ID?
-
当我使用可浏览 API 发布新的
EquipmentInfo记录时,我收到一条错误消息,指出equipment_type和manufacturer_name已经存在。这是意料之中的,因为我已经有EquipmentType和EquipmentManufacturer记录。但现在我想添加一个新的EquipmentInfo记录。所以在某种程度上,是的,我只想传递现有对象的记录 ID。理想情况下,发送信息的任何设备都不必知道 id 字段的值,而只需能够使用equipment_type和manufacturer_name。这有助于澄清吗?
标签: python django django-rest-framework