【问题标题】:nested serialization dont now create a forignkey it requires a new Object instead of 'id'嵌套序列化不知道创建外键它需要一个新对象而不是“id”
【发布时间】:2018-07-24 11:57:45
【问题描述】:

这是我的模型、序列化程序和输出,但是当我想创建一个新页面时,它要求我添加一个全新的用户,因为它只是一个外键,它需要是一个像 1(用户 ID)这样的数字并且相同在类别的情况下我该如何解决它....请帮帮我

serializers.py

​​>
class TeamMembersSerializer(serializers.ModelSerializer):
    class Meta:
        model = TeamMembers
        fields = [
            'user',
            'page',
        ]
        depth = 1

class SocialAccountsSerializer(serializers.ModelSerializer):
    social = SocialCatSerializer()
    class Meta:
        model = SocialAccounts
        fields = [
            'page',
            'social',
            'link'
        ]
        depth = 1

class PageImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = PageImages
        fields = [
            'page',
            'image',
        ]
        depth = 1

class PageSerializer(serializers.ModelSerializer):
    owner = UserSerializer()
    catagory = BusinessCatSerializers()
    business_type = BusinessTypeSerializer()
    TeamMembers = TeamMembersSerializer(read_only=True)
    social_accounts = SocialAccountsSerializer(read_only=True)
    images = PageImageSerializer(read_only=True)
    class Meta:
        model =Page
        fields = [
            'id',
            'owner',
            'catagory',
            'name',
            'username',
            'images',
            'start_date',
            'business_type',
            'contect_number',
            'email_address',
            'website',
            'TeamMembers',
            'social_accounts',
            'about',
            'impression',
            'Awards',
            'Product',
            'privacy_policy',
            'is_active',
        ]

模型.py

class Page(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    catagory = models.ForeignKey(BusinessCatagories, on_delete=models.CASCADE, null=True, blank=True, default=None)
    name = models.CharField(max_length=254, unique=True ,default=None, blank=True)
    username = models.CharField(max_length=254, unique=True, blank=True)
    start_date = models.DateTimeField(auto_now_add=True)
    business_type = models.ForeignKey(BusinessType, on_delete=models.CASCADE, null=True, blank=True, default=None)
    contect_number = models.CharField(max_length=254, default=None, blank=True)
    email_address = models.EmailField(default=None, blank=True)
    website = models.URLField(default=None, blank=True)
    about = models.TextField(default=None, blank=True)
    impression = models.TextField(default=None, blank=True)
    Awards = models.CharField(max_length=254, default=None, blank=True)
    Product = models.CharField(max_length=254, default=None, blank=True)
    privacy_policy = models.URLField(default=None, blank=True)
    is_active = models.BooleanField(default=True)

    def __str__(self):
        return self.name

class TeamMembers(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, default=None, blank=True)
    page =  models.ForeignKey(Page, on_delete=models.CASCADE, default=None, blank=True)

    def __str__(self):
        return self.user.name

class SocialAccounts(models.Model):
    page = models.ForeignKey(Page, on_delete=models.CASCADE, default=None, blank=True)
    social = models.ForeignKey(SocialCats, on_delete=models.CASCADE, default=None, blank=True)
    link = models.URLField(default=None, blank=True)

    def __str__(self):
        return self.link

class PageImages(models.Model):
    page = models.ForeignKey(Page, on_delete=models.CASCADE, default=None, blank=True)
    image = models.ImageField(default=None, blank=True, upload_to=settings.MEDIA_ROOT)

    def __str__(self):
        return self.page.name

输出是这个,但我需要图像字段 TeamMember 字段,但它没有出现,而且它希望我添加一个新用户而不是询问外键“id”

【问题讨论】:

  • 请发布代码本身,而不是代码的图像
  • 在这里....现在请帮帮我

标签: python django django-rest-framework django-serializer


【解决方案1】:

您想要的是使用主键相关字段。它可以帮助您使用其主键来表示关系的目标。

它应该看起来像这样。
注意:请注意任何名称的拼写错误

class PageSerializer(serializers.ModelSerializer):
    owner = serializers.PrimaryKeyRelatedField(queryset = User.objects.all())
    catagory = serializers.PrimaryKeyRelatedField(queryset = BuisnessCat.objects.all())
    business_type = BusinessTypeSerializer()
    TeamMembers = TeamMembersSerializer(read_only=True)
    social_accounts = SocialAccountsSerializer(read_only=True)
    images = PageImageSerializer(read_only=True)

您可以阅读有关 PrimaryKeyRelatedField here 的更多信息。

现在,无论何时创建任何页面,您只需要提供所有者和类别的主键即可。

【讨论】:

    【解决方案2】:

    您正在寻找Writable Nested Serializer

    简而言之,您必须覆盖 PageSerializercreate() 方法

    class PageSerializer(serializers.ModelSerializer):
        ....
        ....
        your code
        def create(self, validated_data):
            # pop data of every related fields like "owner", "cateagory" etc from validated_data
            owner = validated_data.pop("owner")
            owner = User.objects.create(**owner)
    
            category = validated_data.pop("category")
            # create or retrieve category instance ,as above
            ...
            ...
            ...
            # finally
            return Page.objects.create(**validated_data,owner=owner,category=category, and other related instances)
    

    【讨论】:

    • 还是一样
    • 再次出现此错误{ "owner": { "non_field_errors": [ "Invalid data. Expected a dictionary, but got int." ] }, "catagory": { "non_field_errors": [ "Invalid data. Expected a dictionary, but got int." ] }, "business_type": { "non_field_errors": [ "Invalid data. Expected a dictionary, but got int." ] } }
    • ` def create(self,validated_data): # 从 valid_data 中弹出每个相关字段的数据,如“所有者”、“类别”等 owner = valid_data.pop("owner") owner = User.objects .create(**owner) 类别 = 已验证的_data.pop("类别") 类别 = BusinessCatagories(**类别) business_type = 已验证的_data.pop("business_type") business_type = BusinessType(**business_type) 返回 Page.objects.create( **validated_data, owner=owner, catagory=catagory, business_type=business_type)`
    猜你喜欢
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多