【问题标题】:Serializing Foreign Key Field序列化外键字段
【发布时间】:2019-10-11 09:51:37
【问题描述】:

我有以下型号:

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)

我正在尝试序列化测试对象以包含来自 User 模型的用户名和 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')

问题集以这种方式序列化很好,但关系反过来,如果这是描述它的正确方式,那么对于用户,我会得到一个带有此代码的空对象。我已经在字段中尝试了 user_username 和 user.username,但这不起作用。

我在网上搜索并查看了Django-Rest-Framework文档,但只能找到关系作为要测试的问题的示例。

【问题讨论】:

    标签: python django serialization django-models django-rest-framework


    【解决方案1】:

    希望我能正确理解您的问题。

    你的 models.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。您在问题Model 中有ForeignKey 字段,参考Test 模型。想法是,你有许多 Question 和一个 Test (ManyToOne),反之亦然,一个 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)
    

    【讨论】:

    • 非常感谢,就是这样!当我感到困惑时,你能告诉我如何描述模型中的这种关系吗?是多对一吗?
    • 是的。 ForeignKey 是多对一。我更新了我的答案并描述了它的含义。祝你好运。
    猜你喜欢
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    相关资源
    最近更新 更多