Задать вопрос
@Elenalafjfeojewv

Почему у меня в django rest framework нет кнопки для динамического добавления вложенных данных формы, если должна быть?

Прошу о помощи

Взгляните на скрин пожалуйста, не могу понять почему не могу добавлять links динамически

643dd474044be223887952.jpeg

**Вот такой вид данных формата Json должен получиться:
values {
"firstname": "l",
"lastname": "m",
"links": [
{
  "linkname": "https://www.youtube.com/",
  "linkurl": "https://www.youtube.com/"
},
{
  "linkname": "https://www.youtube.com/",
  "linkurl": "https://www.youtube.com/"
}
]
}


И к тому же даже если вот эти все существующие поля заполнить(ну то есть те поля, которые уже есть в django rest framework, а именно - один массив links и Имя вместе с Фамилией) выводится ошибка:
The .create() method does not support writable nested fields by default. Write an explicit .create() method for serializer schedule.serializers.WorkSuperSerializer, or set read_only=True on nested serializer fields.


Я перебирала очень много вариантов решения проблемы, например объявляла метод create():
def create(self, validated_data):
        links_data = validated_data.pop('links')
        worksuper = WorkSuper.objects.create(**validated_data)
        for link_data in links_data:
            Link.objects.create(worksuper=worksuper, **link_data)
        return worksuper


Но ошибка как была, так и есть.

Вообще вот мой код:

Models.py:
class WorkSuper(models.Model):
    firstname = models.CharField("Имя", max_length=10, blank=True)
    lastname = models.CharField("Фамилия", max_length=30, blank=True)
class Link(models.Model):
    links = models.ForeignKey(WorkSuper, related_name='links', on_delete=models.CASCADE, blank=True)
    linkname = models.CharField("linkname", max_length=100, blank=True)
    linkurl = models.CharField("linkurl", max_length=100, blank=True)


Serializers.py:
class WorkSuperSerializer(serializers.ModelSerializer):
    links = LinkSerializer()

    class Meta:
        model = WorkSuper
        fields = ('firstname', 'lastname', 'links')
        # depth = 1

        def create(self, validated_data):
            links_data = validated_data.pop('links')
            worksuper = WorkSuper.objects.create(**validated_data)
            for link_data in links_data:
                Link.objects.create(worksuper=worksuper, **link_data)
            return worksuper
        # def to_representation(self, instance):
        #     data = super().to_representation(instance)
        #     data['links']['links'] = instance.inner.link
        #     # return super().to_representation(instance)
        #     return data


Views.py:
class WorkSuperView(viewsets.ModelViewSet):
   serializer_class = WorkSuperSerializer

   def get_queryset(self):
       queryset = WorkSuper.objects.all()
       return queryset

   def list(self, request, *args, **kwargs):
       queryset = self.get_queryset()
       serializer = self.serializer_class(queryset, many=True)
       data = serializer.data
       # return JsonResponse({'data': data})
       return Response(serializer.data)


Еще хочу сказать вам, что получается вот такой json при заполнении формы(скрин ниже), то есть links пустые(((
643dd549ae89b849134195.jpeg

Я надеюсь на помощь, потому что уже долго не могу разобраться.(((

Заранее спасибо Помогите пожалуйста

\Я действительно очень очень долго уже не могу с этим справиться, перечитала уже просто все.

Мне просто нужна помощь того, кто поумнее
  • Вопрос задан
  • 123 просмотра
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Realmixer
Full stack Python (Django) web-developer
В приведённом вами коде serializers.py метод create находится в классе Meta, а должен в быть WorkSuperSerializer.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы