Как сериализовать 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 нет - создать новую

Вернуться на верх