序列化外键字段

2024-04-26 12:14:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下型号:

class Question(models.Model):
    test = models.ForeignKey(Test, on_delete=models.CASCADE)
    text = models.CharField(max_length=255,default='',blank=False)
    number = models.IntegerField()

    def __str__(self):
        return self.text

class Test(models.Model):
    PRIVACY_TYPES = (
        ('PR', 'Private'),
        ('PU', 'Public'),
    )
    user = models.ForeignKey(User, on_delete=models.PROTECT)
    name = models.CharField(max_length=255,default='',blank=False)
    datecreated = models.DateTimeField(auto_now=True)
    privacy = models.CharField(choices=PRIVACY_TYPES, default='PR',max_length=15)
    testtime = models.IntegerField(default=30)


class User(AbstractBaseUser, models.Model):
    username = models.CharField(max_length=20,default='',blank=True)
    password = models.CharField(max_length=80,default='',blank=True)
    email = models.CharField(max_length=255,default='',blank=True)

我正在尝试序列化测试对象,以便还包括用户模型中的用户名和id。下面是我正在尝试的序列化程序:

class TestSerializer(serializers.ModelSerializer):
    question_set = QuestionSerializer(many=True)
    user = UserSerializer(source='user')

    class Meta:
        model = Test
        fields = ('id', 'name', 'privacy', 'testtime', 'user', 'question_set')
        related_object = 'question'

用户序列化程序如下所示:

class UserSerializer(serializers.Serializer):
    class Meta:
        model = User
        fields = ('id', 'username')

问题集以这种方式序列化很好,但是关系反过来,如果这是描述它的正确方式,那么对于用户来说,我用这个代码得到一个空对象。我试过用户名和用户名在地里,但那不管用。你知道吗

我在网上搜索并查看了Django Rest框架文档,但只能找到将关系作为测试问题的示例。你知道吗


Tags: 用户testtruedefaultmodel序列化modelslength
1条回答
网友
1楼 · 发布于 2024-04-26 12:14:03

希望我能正确理解你的问题。你知道吗

你的型号.py你知道吗

class Question(models.Model):
        test = models.ForeignKey(Test, on_delete=models.CASCADE)
        text = models.CharField(max_length=255,default='',blank=False)
        number = models.IntegerField()

        def __str__(self):
            return self.text



class Test(models.Model):
        PRIVACY_TYPES = (
            ('PR', 'Private'),
            ('PU', 'Public'),
        )
        user = models.ForeignKey(User, on_delete=models.PROTECT)
        name = models.CharField(max_length=255,default='',blank=False)
        datecreated = models.DateTimeField(auto_now=True)
        privacy = models.CharField(choices=PRIVACY_TYPES, default='PR',max_length=15)
        testtime = models.IntegerField(default=30)

我的问题更新了,向您展示了ForeignKey的含义。ForeignKey表示ManyToOne。关于Test模型,Model有问题的ForeignKey字段。这个想法是,你有许多Question和一个TestManyToOne),反之亦然,一个Test和许多Question。你知道吗

这是下面的解决方案

class TestSerializer(serializers.ModelSerializer):
    question_set = QuestionSerializer(many=True)
    user = serializers.ReadOnlyField(source='user.username')

    class Meta:
        model = Test
        fields = ('id', 'name', 'privacy', 'testtime', 'user', 'question_set')
        related_object = 'question'

现在用它

test_obj = Test.objects.get(pk=1)
test_serializer = TestSerializer(instance=test_obj)
print(test_serializer.data)

相关问题 更多 >