Поле сериализатора может иметь неправильное имя и не соответствовать ни одному атрибуту или ключу в экземпляре `GenericRelatedObjectManager` - PullRequest
0 голосов
/ 13 февраля 2019

Я не могу понять, почему я получаю эту ошибку "Поле сериализатора может иметь неправильное имя и не соответствовать ни одному атрибуту или ключу в экземпляре GenericRelatedObjectManager. Исходный текст исключения был: объект 'GenericRelatedObjectManager' не имеет атрибута'страна'.".Я работал над этим в течение нескольких дней, может кто-нибудь помочь мне, пожалуйста?Что не так с моим кодом?Заранее спасибо.

Я хочу создать вложенный сериализатор с функцией CRUD.Планируя использовать это в моем DRF.

У меня есть 3 взаимосвязанные модели, а именно Компания, Адрес и Страна.

  • Модель компании имеет поле с именем " address ", и это GenericForeignKey.
  • Модель адреса имеет поле с именем " страна "и это ForeignKey.
  • Модель страны является CountryField ().Я использую плагин django_countries.

Структура модели

Company
 |__Address (GenericForeignKey)
    |___Country (ForeignKey)

Модель компании

from django_countries.fields import CountryField

class SalesClientCompany(models.Model):
            address = GenericRelation(
                Address,
                null=True,
                blank=True,
            )

Адрес Модель

class Address(models.Model):

    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE,)

    object_id = models.UUIDField(
        primary_key=False,
        unique=False,
        default=uuid.uuid4,
        blank=True,
        null=True,
    )

    content_object = GenericForeignKey()

    country = models.ForeignKey(
        Country,
        verbose_name=_("Country"),
        to_field='country',
        blank=False,
        on_delete=models.CASCADE,
    )

Модель страны

from django_countries.fields import CountryField

class Country(SmardtAbstractHistory):

    country = CountryField(
        unique=True,
    )

    name = SmardtTranslateField(
        models.CharField(
            max_length=50,
            null=True,
        )
    )

Сериализаторы

from rest_framework import serializers
from django.contrib.contenttypes.models import ContentType, ContentTypeManager


from models.client_companies import SalesClientCompany
from country.models.countries import Country
from models.addresses import Address


class CountrySerializer(serializers.ModelSerializer):

    class Meta:
        model = Country
        fields = ('country',)


class ClientCompanyAddressSerializer(serializers.ModelSerializer):
    country = CountrySerializer()
    # country = serializers.SlugRelatedField(queryset=Country.objects.all(), slug_field='country') 
    class Meta:
        model = Address
        fields = ('line_first', 'line_second', 'province', 'country',  'postal_code',)



class ClientCompanySerializer(serializers.ModelSerializer):

    address = ClientCompanyAddressSerializer()

    class Meta:
        model = SalesClientCompany
        fields = ['id', 'name', 'address',  'email', 'phone', 'type', 'company_directory']

    def create(self, validated_data):

        company = SalesClientCompany(
            name=validated_data['name'],
            email=validated_data['email'],
            .....
        )
        company.save()

        content_type = ContentType.objects.get_for_model(SalesClientCompany)

        company_address = Address(
            content_type=content_type,
            object_id=company.pk,
            content_object=company,
            country=validated_data['address']['country'],
            .....

        )

        company_address.save()

        return company

Проверка сериализатора

ClientCompanyAddressSerializer():
    line_first = CharField(allow_blank=True, label='Address Line 1', max_length=255, required=False)
    line_second = CharField(allow_blank=True, label='Address Line 2', max_length=255, required=False)
    province = CharField(allow_blank=True, label='State/Province/Region', max_length=255, required=False)
    country = SlugRelatedField(queryset=Country.objects.all(), slug_field='country')    
    postal_code = CharField(allow_blank=True, label='Zip/Postal Code', max_length=255, required=False)

Просмотр

class ClientCompanyCreate( generics.ListCreateAPIView ):
    queryset = SalesClientCompany.objects.all()
    serializer_class = ClientCompanySerializer

1 Ответ

0 голосов
/ 13 февраля 2019

Извините, я не могу писать в комментариях, но поле класса в сериализаторе не будет кортежем.

fields = ('line_first', 'line_second', 'провинция', 'страна', 'postal_code»)

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