Django "TypeError: '...' объект не повторяется" - PullRequest
0 голосов
/ 03 ноября 2019

Мне нужно, чтобы в контактах курсов было несколько значений, например, телефон, Facebook и т. Д.

Я переопределяю метод create, чтобы создавать записываемые вложенные поля. Все отлично работает с "ветками". Я в замешательстве, потому что не могу понять, почему Contact не повторяется.

Models.py:

class Branch(models.Model):
    latitude = models.CharField(max_length=50)
    longitude = models.CharField(max_length=50)
    address = models.CharField(max_length=100)

    class Meta:
        ordering = ['latitude']

    def __str__(self):
        return self.address

class Contact(models.Model):
    type = models.IntegerField(choices=TYPE, default=1)
    value = models.CharField(max_length=100, null=False)

    class Meta:
        ordering = ['type']

    def __str__(self):
        return "{} {}".format(self.type, self.value)

class Course(models.Model):
    ...
    branches = models.ForeignKey(Branch, on_delete=models.CASCADE, null=False, default=True)
    contacts = models.ForeignKey(Contact, on_delete=models.CASCADE, null=False, default=True)

    class Meta:
        ordering = ['name']

    def __str__(self):
        return self.name

Serializer.py:

class CourseSerializer(serializers.ModelSerializer):
    ...
    branches = BranchSerializer(many=True)
    contacts = ContactSerializer(many=True)

    class Meta:
        model = Course
        fields = ['name', 'description', 'category', 'logo', 'contacts', 'branches']

    def create(self, validated_data):
        branches_data = validated_data.pop('branches')
        contacts_data = validated_data.pop('contacts')
        course = Course.objects.create(**validated_data)
        for branches in branches_data:
            branch = Branch.objects.create(**branches)
            course.branches = branch
        for contacts in contacts_data:
            contact = Contact.objects.create(**contacts)
            course.contacts = contact
        return course

UPD: Трассировка:

Файл "/courseapp_task/venv/lib/python3.6/site-packages/django/core/handlers/exception.py "во внутреннем 34. response = get_response (запрос)

Файл" /courseapp_task/venv/lib/python3.6/site-packages/django/core/handlers/base.py "в _get_response 115. response = self.process_exception_by_middleware (e, запрос)

Файл "/courseapp_task/venv/lib/python3.6/site-packages/django/core/handlers/base.py" в _get_response 113. response = wrapped_callback(request, * callback_args, ** callback_kwargs)

Файл "/courseapp_task/venv/lib/python3.6/site-packages/django/views/decorators/csrf.py" в wrapped_view 54. вернуть view_func (* args, ** kwargs)

Файл "/courseapp_task/venv/lib/python3.6/site-packages/rest_framework/viewsets.py" в представлении 114. вернуть self.dispatch (request, * args, ** kwargs)

Файл "/courseapp_task/venv/lib/python3.6/site-packages/rest_framework/views.py" в отправке 505. response = self.handle_exception (exc)

Файл "/courseapp_task/venv/lib/python3.6/site-packages/rest_framework/views.py" в handle_exception 465. self.raise_uncaught_exception (exc)

File "/ courseapp_task / venv/lib/python3.6/site-packages/rest_framework/views.py "в Raise_uncaught_exception 476. повышение exc

Файл" /courseapp_task/venv/lib/python3.6/site-packages/rest_framework/views. py "в отправке 502. response = обработчик (запрос, * args, ** kwargs)

File" /courseapp_task/venv/lib/python3.6/site-packages/rest_framework/mixins.py "при создании20. headers = self.get_success_headers (serializer.data)

Файл "/courseapp_task/venv/lib/python3.6/site-packages/rest_framework/serializers.py" в данных 559. ret = super ().data

Файл "/courseapp_task/venv/lib/python3.6/site-packages/rest_framework/serializers.py" в виде данных261. self._data = self.to_representation (self.instance)

Файл "/courseapp_task/venv/lib/python3.6/site-packages/rest_framework/serializers.py" в to_representation 526. ret [field.field_name] = field.to_representation (attribute)

Файл "/courseapp_task/venv/lib/python3.6/site-packages/rest_framework/serializers.py" в to_representation 675. self.child.to_representation (item) для элемента в итерируемом

1 Ответ

0 голосов
/ 03 ноября 2019

Проблема не в ваших вложенных сериализаторах. Проблема в самих ваших моделях.

ForeignKey - это отношение один к одному. Как вы определили вещи, курс может иметь только одну ветку и один контакт. Обращение к полям «ответвления» и «контакты» не меняет этого, равно как и установка «many = True» в сериализаторах.

Вам необходимо изменить модели, чтобы ForeignKeys находились в Branch и Contactсами, указывая на курс. Затем сериализатор будет использовать связанные имена.

Обратите внимание, вам не нужно определять create;все там должно просто работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...