DRF Создание нового объекта и ссылка на связанные с ним элементы (но не создание) (вложенный сериализатор)?

Я пытаюсь связать несколько элементов (поддоменов) с создаваемым элементом (доказательством).

Моя форма отправляется нормально - но я пытаюсь выяснить "лучший" способ сделать это.

Согласно документации я должен переопределить метод create - но их пример показывает, что они "создают" связанные объекты.

Я не хочу этого делать. Я хочу просто добавить эти связанные элементы к создаваемому мной доказательству (чтобы создать взаимосвязь)

Вот мои сериализаторы:

class SubdomainSerializer(serializers.ModelSerializer):
    class Meta:
        model = Subdomain
        fields = [
            "id",
            "domain",
            "short_description",
            "long_description",
            "character_code",
        ]


class EvidenceSerializer(serializers.ModelSerializer):
    """
    """

    created_by = serializers.HiddenField(
        default=serializers.CurrentUserDefault()
    )
    updated_by = serializers.HiddenField(
        default=serializers.CurrentUserDefault()
    )
    absolute_url = serializers.SerializerMethodField()
    created_by_name = serializers.SerializerMethodField()
    updated_by_name = serializers.SerializerMethodField()
    subdomains = SubdomainSerializer(many=True)

    class Meta:
        model = Evidence
        fields = "__all__"
        extra_kwargs = {
            "subdomains": {
                "error_messages": {
                    "null": "This field is required.",
                    "blank": "This field is required.",
                }
            },
        }

    def get_absolute_url(self, obj):
        return obj.get_absolute_url()

    def get_created_by_name(self, obj):
        return obj.created_by.full_name

    def get_updated_by_name(self, obj):
        return obj.updated_by.full_name

    def create(self, validated_data):
        subdomains_data = validated_data.pop("subdomains")
        evidence = Evidence.objects.create(**validated_data)
        for subdomain in subdomains_data:
            # This is where I want to add the subdomains to the evidence - not create ones - how best to accomplish that?
            Subdomain.objects.create(**subdomain)
        return evidence

    def update(self, instance, validated_data):
        # Add the requestor as the updater in a PATCH request
        request = self.context["request"]
        validated_data["updated_by"] = request.user
        return super().update(instance, validated_data)

Есть ли лучший способ настроить мои сериализаторы? Должен ли я делать что-то другое, чтобы сделать это более достижимым?

Здесь вы хотите установить subdomain ForeignKey на новый созданный evidence. Для этого вам просто нужно получить субдомен и обновить его поле доказательства следующим образом :

def create(self, validated_data):
    subdomains_data = validated_data.pop("subdomains")
    evidence = Evidence.objects.create(**validated_data)
    for subdomain in subdomains_data:
        # Retrieve the subdomain and update the evidence attribute
        sub_id = subdomain['id']
        sub = Subdomain.objects.get(id=sub_id)
        sub.evidence = evidence
        sub.save()
    return evidence

NB : Я использую обратное отношение ForeignKey по умолчанию: sub.evidence

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