Python 如何让Django引用名称而不是id/pk
我目前正在使用Python和Django编写一个教程API。我希望导师模型显示所有的导师(是的,这是一个词),导师显示导师。现在,它工作正常,但它引用了模型的id/pk,所以我真的不知道它指的是谁或什么 获得辅导:Python 如何让Django引用名称而不是id/pk,python,django,rest,django-models,django-rest-framework,Python,Django,Rest,Django Models,Django Rest Framework,我目前正在使用Python和Django编写一个教程API。我希望导师模型显示所有的导师(是的,这是一个词),导师显示导师。现在,它工作正常,但它引用了模型的id/pk,所以我真的不知道它指的是谁或什么 获得辅导: { "id": 1 "full_name": "First Last", "email": "email@emailprovidercom", "tutor": 1
{
"id": 1
"full_name": "First Last",
"email": "email@emailprovidercom",
"tutor": 1,
"subjects": "SubjectX"
}
正如你所看到的,导师是一个数字而不是一个名字
找个家庭教师:
{
"id": 1,
"full_name": "First Last",
"email": "name.name@emailprovider.com",
"notes": "XXXXX XX XX X X X X X X XXXXXX XX X X X X ",
"tutees": [
1
]
}
同样的事情也发生在这里
我正在使用Django Rest框架
我的模型
class Tutor(models.Model):
full_name = models.CharField(max_length=40)
email = models.EmailField()
notes = models.TextField()
def __str__(self):
return self.full_name
class Tutee(models.Model):
full_name = models.CharField(max_length=40)
email = models.EmailField()
tutor = models.ForeignKey(Tutor, on_delete=models.CASCADE, related_name="tutees")
subjects = models.CharField(max_length=13)
def __str__(self):
return self.full_name
我的序列化程序
class TutorSerializer(serializers.ModelSerializer):
class Meta:
model = Tutor
fields = ['id', 'full_name', 'email', 'notes', 'tutees']
class TuteeSerializer(serializers.ModelSerializer):
class Meta:
model = Tutee
fields = ['id', 'full_name', 'email', "tutor", "subjects"]
我的视图集
class TutorAPI(viewsets.ModelViewSet):
queryset = Tutor.objects.all()
serializer_class = TutorSerializer
permission_classes = [permissions.IsAuthenticated]
lookup_field = "full_name"
class TuteeAPI(viewsets.ModelViewSet):
queryset = Tutee.objects.all()
serializer_class = TuteeSerializer
permission_classes = [permissions.IsAuthenticated]
lookup_field = "full_name"
如果你需要更多,请评论,我将编辑我的问题!即使您只是将其标记为重复,这也会很有帮助。如果您只想获得字符串表示,这可能会有所帮助
class TuteeSerializer(serializers.ModelSerializer):
tutor = serializers.StringRelatedField(many=True)
class Meta:
model = Tutee
fields = ['id', 'full_name', 'email', "tutor", "subjects"]
获取pk或名称可能对您没有意义。您应该同时获得两个或更多字段。根据您的需求,嵌套序列化程序可能是一个很好的解决方案 您可能会看到这样的情况:
class TutorSerializer(serializers.ModelSerializer):
类元:
模型=导师
字段=['id'、'全名'、'电子邮件',]
类TuteeSerializer(serializers.ModelSerializer):
导师信息=TutorSerializer()
类元:
模特=短裙
字段=['id'、'全名'、'电子邮件'、'导师信息'、'科目']
这对另一个序列化程序有效。(导师)不是导师。我删除了导师的many=True,效果很好!非常感谢。这里的解决方案可能是嵌套序列化程序。获得导师的名字对你来说也没有意义,因为这可能不是唯一的。Id/Pk仍然是有意义的,因为它表示系统中有一个导师。我删除了many=True,它成功了。我怎么可能只从它那里得到名字、电子邮件等,而不是所有的东西呢。现在,我也得到了导师的辅导,这有点重复。没关系,我对另一个人的答案做了一些编辑,它起作用了。你可以编辑导师序列器,只包括id
和name
。我想您没有注意到我对TutorSerializer
所做的更改。请仔细看一下。