【问题标题】:How to get Django to reference the name instead of the id/pk如何让 Django 引用名称而不是 id/pk
【发布时间】:2021-04-26 03:29:41
【问题描述】:

我目前正在使用 Python 和 Django 开发一个辅导 API。我希望 Tutor Model 向所有 tutees 展示(是的,这是一个词),并且 tutee 向 Tutor 展示。现在,它可以正常工作,但它引用了模型的 id/pk,所以我真的不知道它指的是谁或什么。

找一个学生:

{
"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"

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

【问题讨论】:

  • 这里的解决方案可能是嵌套序列化器。获取导师的名字对你来说也没有意义,因为这可能不是唯一的。 Id/Pk 仍然有意义,因为它表示系统中的一位导师。

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


【解决方案1】:

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

class TuteeSerializer(serializers.ModelSerializer):
    tutor = serializers.StringRelatedField(many=True)
    class Meta:
        model = Tutee
        fields = ['id', 'full_name', 'email', "tutor", "subjects"]

【讨论】:

【解决方案2】:

获取 pk 或名称可能对您没有意义。你应该得到两个甚至更多的字段。根据您的要求,Nest 序列化程序可能是一个很好的解决方案。

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

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"]

【讨论】:

  • 我删除了 many=True 并且它起作用了。我将如何只从中获取姓名、电子邮件等而不是所有内容。现在,我也让 Tutors 学生回来了,这有点重复。
  • 没关系,我对其他人的答案进行了一些编辑,它可以工作。
  • 您可以编辑TutorSerializer 以仅包含idname。我想你没有注意到我对TutorSerializer 所做的更改。请仔细看看。
猜你喜欢
  • 1970-01-01
  • 2020-11-12
  • 2021-03-01
  • 2018-04-30
  • 2018-10-13
  • 1970-01-01
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多