私はDjangoとDjango-RESTの新機能ですので、私にご負担ください。おそらく答えはドキュメントにありますので、私がそれを逃した場合は、事前にお詫び申し上げます。Django REST - シリアライザを使用して外部キーを持つオブジェクトを作成する
目標:属性に既存の外部キー(EquipmentTypeとEquipmentManufacturer)が含まれているEquipmentInfoオブジェクトを作成したいとします。
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
私はすでに作成され、関連するEquipmentTypeとEquipmentManufacturerオブジェクトを持っていると仮定すると、私は別のEquipmentInfoオブジェクトを追加したいと思います。
{
"equipment_type":"already_created",
"part_identifier":"something_new",
"manufacturer_name":"already_created",
"serial_number":"WBA1",
"date_of_manufacture": "1900-01-01",
"is_active":true
}
すべてのヘルプは高く評価されています。私は、このような
{
"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
}
またはより良いなどの情報を渡すことができるように、何が私のEquipmentInfo・シリアライザを設定するための適切な方法です。
あなたは明確にできますか? getを実行するときにネストされたシリアライザを取得できるようにするには問題がありますが、ポスティング時には既存のオブジェクトのレコードIDを渡したいだけですか? – dkarchmer
ブラウズ可能なAPIを使用して新しい 'EquipmentInfo'レコードを投稿すると、 'equipment_type'と' manufacturer_name'が既に存在するというエラーが表示されます。私は既に 'EquipmentType'と' EquipmentManufacturer'レコードを持っているのでこれが期待されます。しかし今、私は新しい 'EquipmentInfo'レコードを追加したいと思います。つまり、ある意味では、既存のオブジェクトのレコードIDを渡したいだけです。理想的には、情報を送信するどのデバイスであれ、idフィールドの値を知る必要はなく、単に 'equipment_type'と' manufacturer_name'を使うことができます。それが明確になるのに役立つのでしょうか? – mcaro