Wre*_*cks 4 django django-serializer django-rest-framework
我无法弄清楚为什么我会收到此错误“序列化程序字段可能命名不正确,并且与GenericRelatedObjectManager实例上的任何属性或键都不匹配。原始异常文本是:'GenericRelatedObjectManager' 对象没有属性 'country'。”。我已经为此工作了几天,有人可以帮助我吗?我的代码有什么问题?提前致谢。
我想创建一个具有 CRUD 功能的嵌套序列化程序。计划在我的 DRF 中使用它。
我有 3 个相互关联的模型,即公司、地址和国家。
模型结构
Company
|__Address (GenericForeignKey)
|___Country (ForeignKey)
Run Code Online (Sandbox Code Playgroud)
公司模式
from django_countries.fields import CountryField
class SalesClientCompany(models.Model):
address = GenericRelation(
Address,
null=True,
blank=True,
)
Run Code Online (Sandbox Code Playgroud)
地址模型
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,
)
Run Code Online (Sandbox Code Playgroud)
国家模式
from django_countries.fields import CountryField
class Country(SmardtAbstractHistory):
country = CountryField(
unique=True,
)
name = SmardtTranslateField(
models.CharField(
max_length=50,
null=True,
)
)
Run Code Online (Sandbox Code Playgroud)
序列化器
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
Run Code Online (Sandbox Code Playgroud)
检查序列化程序
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)
Run Code Online (Sandbox Code Playgroud)
看法
class ClientCompanyCreate( generics.ListCreateAPIView ):
queryset = SalesClientCompany.objects.all()
serializer_class = ClientCompanySerializer
Run Code Online (Sandbox Code Playgroud)
即使您的序列化程序彼此知道,序列化程序也不知道如何将模型链接在一起。source初始化嵌套序列化器时需要指定参数,并提供related_name模型中外键的值。
例如:
class ClientCompanyAddressSerializer(serializers.ModelSerializer):
country = CountrySerializer(source='country_set')
class Meta:
model = Address
fields = ('line_first', 'line_second', 'province', 'country', 'postal_code',)
Run Code Online (Sandbox Code Playgroud)
在您的代码中,您related_name在定义ForeignKey字段时没有提供显式,因此 Django 会自动生成相关名称 country_set(模型名称 + '_set')。
另请参阅此答案(“ Django Rest Framework Nested Serializers ”)和此答案(“在 Django Rest Framework 中的响应中包含中介(通过模型) ”)。
小智 0
抱歉,我无法发表评论,但序列化器类中的字段不会是元组。
fields = ('line_first', 'line_second', 'province', 'country', 'postal_code',)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7010 次 |
| 最近记录: |