Django 序列化程序字段的名称可能不正确,并且与“GenericRelatedObjectManager”实例上的任何属性或键都不匹配

Django 序列化程序字段的名称可能不正确,并且与“GenericRelatedObjectManager”实例上的任何属性或键都不匹配,django,django-rest-framework,django-serializer,Django,Django Rest Framework,Django Serializer,我无法理解为什么会出现此错误“序列化程序字段的名称可能不正确,并且与GenericRelatedObjectManager实例上的任何属性或键都不匹配。原始异常文本是:“GenericRelatedObjectManager”对象没有属性“country”。”。我已经做了好几天了,有人能帮我吗?我的代码有什么问题?提前谢谢 我想创建一个具有CRUD功能的嵌套序列化程序。计划在我的DRF中使用它 我有三个相互关联的模型,即公司、地址和国家 公司模型有一个名为“地址”的字段,它是一个通用外键 地址

我无法理解为什么会出现此错误“序列化程序字段的名称可能不正确,并且与
GenericRelatedObjectManager
实例上的任何属性或键都不匹配。原始异常文本是:“GenericRelatedObjectManager”对象没有属性“country”。”。我已经做了好几天了,有人能帮我吗?我的代码有什么问题?提前谢谢

我想创建一个具有CRUD功能的嵌套序列化程序。计划在我的DRF中使用它

我有三个相互关联的模型,即公司、地址和国家

  • 公司模型有一个名为“地址”的字段,它是一个通用外键
  • 地址模型有一个名为“国家”的字段,它是ForeignKey
  • 国家/地区模型是CountryField()。我正在使用django_国家插件
模型结构

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 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 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

很抱歉,我无法在评论中发布,但不会。序列化程序类中的字段将是元组


fields=('line\u first'、'line\u second'、'province'、'country'、'postal\u code')

即使序列化程序彼此知道,序列化程序也不知道如何将模型链接在一起。初始化时需要指定
source
参数,并在模型中提供外键的
相关名称的值

例如:

class ClientCompanyAddressSerializer(serializers.ModelSerializer):
    country = CountrySerializer(source='country_set')
    
    class Meta:
        model = Address
        fields = ('line_first', 'line_second', 'province', 'country',  'postal_code',)
在您的代码中,在定义
ForeignKey
字段时,您没有提供明确的
相关的\u名称
,因此Django
国家/地区集
(型号名称+“\u集”)


另请参见(“Django Rest Framework嵌套序列化程序”)和(“在Django Rest Framework中的响应中包含中间层(通过模型)”。

('a','b','c')
testClientCompanyAddressSerializer类包含不在address model中的字段抱歉,我没有理解您刚才所说的内容。你能进一步解释吗?请忽略这些字段。我已经准备好了完整的字段列表。列表也可以工作,我也尝试过更改为tuple,但结果相同。