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