序列化外键字段 [英] Serializing Foreign Key Field

查看:164
本文介绍了序列化外键字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下模型:

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。这是我正在尝试的序列化器:

I am trying to serialize the test object to also include the username and id from the User model. Here is the serializer I am trying:

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,但这不起作用。

The question set serializes fine this way, but with the relationship the other way round, if that is the right way to describe it, for user then I get an empty object with this code. I have tried user_username and user.username in the fields, but that doesn't work.

我已经在线搜索并查看了Django-Rest-Framework文档,但是

I have searched online and looked at the Django-Rest-Framework documents, but can only find examples where the relationship is as the question to test.

推荐答案

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

I hope, I understand your question correctly.

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 。您在问题模型 ForeignKey 字段中引用了 Test 模型。想法是,您有许多问题和一个 Test ManyToOne ),反之亦然。一个测试和许多问题

My question is updated to show you what ForeignKey means. ForeignKey means ManyToOne. You have ForeignKey field in Question Model with reference to Test Model. Idea is, that you have Many Question and One Test (ManyToOne), and vice-versa One Test and Many 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)

这篇关于序列化外键字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆