序列化外键字段 [英] Serializing Foreign Key Field
问题描述
我有以下模型:
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屋!