Sono un po 'nuovo per Django e Django-REST quindi ti prego di sopportare me. Forse la risposta è nella documentazione, quindi se mi sono perso, mi scuso in anticipo.Django REST - Crea oggetto con chiave esterna utilizzando i serializzatori
Obiettivo: Vorrei creare un oggetto EquipmentInfo i cui attributi includono chiavi esterne preesistenti (EquipmentType e 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
serializers.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
Supponendo che ho già rilevanti EquipmentType e gli oggetti creati EquipmentManufacturer, vorrei aggiungere un altro oggetto EquipmentInfo. Qual è il modo appropriato per impostare il mio serializzatore EquipmentInfo in modo che possa passare informazioni
{
"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
}
o meglio ancora:
{
"equipment_type":"already_created",
"part_identifier":"something_new",
"manufacturer_name":"already_created",
"serial_number":"WBA1",
"date_of_manufacture": "1900-01-01",
"is_active":true
}
Ogni aiuto è apprezzato.
Potete chiarire? Il problema in cui si desidera essere in grado di ottenere i serializzatori nidificati quando viene eseguito, ma durante la pubblicazione, si desidera solo passare gli ID record per gli oggetti esistenti? – dkarchmer
Quando uso l'API sfogliabile per pubblicare un nuovo record 'EquipmentInfo', viene visualizzato un errore che dice' equipment_type' e 'manufacturer_name' già esistenti. Questo è previsto perché ho già i record "EquipmentType" e "EquipmentManufacturer". Ma ora vorrei aggiungere un nuovo record 'EquipmentInfo'. Quindi in un certo senso, sì, voglio solo passare gli ID dei record per gli oggetti esistenti. Idealmente, qualunque dispositivo che invii le informazioni non dovrebbe conoscere il valore del campo id e solo essere in grado di usare 'equipment_type' e' manufacturer_name'. Questo aiuta a chiarire? – mcaro