首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何让Django引用名称而不是id/pk

如何让Django引用名称而不是id/pk
EN

Stack Overflow用户
提问于 2021-01-22 00:50:12
回答 2查看 183关注 0票数 0

我目前正在开发一个使用Python和Django的辅导API。我想让tutor Model显示所有的被辅导者(是的,这是一个单词),以及显示辅导者的辅导者。现在,它工作正常,但它引用了模型的id/pk,所以我真的不知道它指的是谁或什么。

找一个tutee:

代码语言:javascript
运行
复制
{
"id": 1
"full_name": "First Last",
"email": "email@emailprovidercom",
"tutor": 1,
"subjects": "SubjectX"
}

正如你所看到的,导师是一个数字而不是一个名字。

找一位家教:

代码语言:javascript
运行
复制
 {
    "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框架。

我的模型

代码语言:javascript
运行
复制
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

我的序列化程序

代码语言:javascript
运行
复制
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"]

我的视图集

代码语言:javascript
运行
复制
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"

如果你需要更多,请评论,我将编辑我的问题!即使您只是将其标记为重复,这也会很有帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-22 00:58:02

如果您只想获得字符串表示,这可能会有所帮助

代码语言:javascript
运行
复制
class TuteeSerializer(serializers.ModelSerializer):
    tutor = serializers.StringRelatedField(many=True)
    class Meta:
        model = Tutee
        fields = ['id', 'full_name', 'email', "tutor", "subjects"]
票数 1
EN

Stack Overflow用户

发布于 2021-01-22 01:47:01

获取pk或名称对您可能没有意义。你应该同时获得两个甚至更多的字段。基于您的需求,Nest serializer可能是一个很好的解决方案。

你可能会看到类似这样的东西:

代码语言:javascript
运行
复制
class TutorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Tutor
        fields = ['id', 'full_name', 'email',]


class TuteeSerializer(serializers.ModelSerializer):
    tutor_info = TutorSerializer()
    class Meta:
        model = Tutee
        fields = ['id', 'full_name', 'email', "tutor_info", "subjects"]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65832034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档