嵌套序列化不知道创建外键它需要一个新对象而不是 'id'

nested serialization dont now create a forignkey it requires a new Object instead of 'id'

这是我的模型、序列化程序和输出,但是当我想创建一个新页面时,它要求我添加一个全新的用户,因为它只是一个外键,它需要是一个数字,如 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',
        ]

Models.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"

您正在寻找 Writable Nested Serializer.

简而言之,您必须覆盖 PageSerializer

create() 方法
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)

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

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

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

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