Как сериализовать Generic Relation в DrangoRestFramework
У меня есть эти сериализаторы для работы с Generic Foreign Key в DRF.
class GenericContactsSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(read_only=False)
class Meta:
model = GenericContacts
fields = (
'id',
'email',
'phone',
'ext',
'contact_name',
'fax',
'producer_email',
'producer_phone',
'producer_phone_ext',
'producer_contact_name',
)
class CompanyCreateOrUpdateSerializer(serializers.ModelSerializer):
company_contacts = GenericContactsSerializer(many=True)
class Meta:
model = Company
fields = (
"id",
"company_contacts",
"company_name",
)
def _manage_company_contacts(self, instance, contacts):
contact_instances = []
c_type = ContentType.objects.get(model='company')
for contact in contacts:
contact_instances.append(GenericContacts(**contact, object_id=instance.id, content_type=c_type))
GenericContacts.objects.bulk_create(contact_instances)
instance.refresh_from_db()
def create(self, validated_data):
company_contacts = validated_data.pop('company_contacts', [])
instance = super().create(validated_data)
self._manage_company_contacts(instance, company_contacts)
return instance
def update(self, instance, validated_data):
company_contacts = validated_data.pop('company_contacts', [])
instance = super().update(instance, validated_data)
instance.company_contacts.all().delete()
self._manage_company_contacts(instance, company_contacts)
return instance
Мой JSON для фронтенда выглядит так:
{
"id": 1,
"company_contacts": [
{
"id": 14,
"email": "lol@mail.com",
"phone": "999-000-1231",
"ext": "321",
"contact_name": "Tom",
"fax": null,
"producer_email": "",
"producer_phone": "",
"producer_phone_ext": null,
"producer_contact_name": null
},
{
"id": 13,
"email": "iliass@mail.com",
"phone": "111-122-2121",
"ext": "123",
"contact_name": "John",
"fax": "",
"producer_email": "ins@mail.com",
"producer_phone": "241-245-1245",
"producer_phone_ext": "333",
"producer_contact_name": "Max"
}
],
"company_name": "Company"
}
А входящий запрос JSON выглядит так:
{
"company_contacts": [
{
"id": 13,
"email": "iliass@mail.com",
"phone": "111-122-2121",
"ext": "123",
"contact_name": "John",
"fax": "",
"producer_email": "ins@mail.com",
"producer_phone": "241-245-1245",
"producer_phone_ext": "333",
"producer_contact_name": "Max"
},
{
"email": "somemail@mail.com",
"phone": "333-333-3333",
"contact_name": "Dan"
}
]
}
Поле 'id' необходимо в запросе, если запись должна быть обновлена, а если нет 'id', то она должна быть создана как новая
Моя проблема: когда я обновляю запись, id этой записи меняется, я полагаю, из-за instance.company_contacts.all().delete(). Может ли кто-нибудь, пожалуйста, обновить мой код следующим образом: если есть ID - обновить существующую запись. Если ID нет - создать новую