Django多对多直通

2024-10-02 22:29:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试实施一个指导系统,但我对django中的序列化有点迷茫,我有一个多对多的直通模型来控制约会,我想得到关于这段关系中的教练/被指导者的所有数据。在

class Appointment(models.Model):
    """docstring for Appointment"""
    coach = models.ForeignKey(User, related_name='coaches', on_delete=models.CASCADE)
    coachee = models.ForeignKey(User, related_name='coachees', on_delete=models.CASCADE)
    schedule_date = models.DateField(auto_now=False, auto_now_add=True, blank=True)
    due_date = models.DateField()
    summary = models.TextField(max_length=200)

使用下面的序列化程序,我可以得到所涉及的主键,但我真的希望在一个请求中获得coach和coachee的详细信息。在

^{pr2}$

Tags: nameautodate序列化onmodelsdeletecascade
2条回答

有几种方法可以做到这一点。常见的方法是为用户创建序列化程序,并使用它代替默认字段:

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ...

class AppointmentSerializer(serializers.ModelSerializer):
    coach = UserSerializer()
    coachee = UserSerializer()

    class Meta:
        model = Appointment
        fields = ('id', 'schedule_date', 'due_date', 'coach', 'coachee', 'summary', 'condition')

但是如果要使用AppointmentSerializer来创建实例,则会出现问题。您将无法将用户的id传递到该字段。在这种情况下,您可以使用默认字段并重写to_representation方法。在

^{pr2}$

尝试在Meta类上设置depth选项。在

class AppointmentSerializer(serializers.HyperlinkedModelSerializer):
    """docstring for AppointmentSerializer"""
    class Meta:
        model = Appointment
        fields = ('id', 'schedule_date', 'due_date', 'coach', 'coachee', 'summary', 'condition')
        depth = 1

这将生成嵌套表示。在

或者,如果需要更多控制,可以显式指定序列化程序。在

^{pr2}$

也可以从相关模型中添加单个字段:

class AppointmentSerializer(serializers.HyperlinkedModelSerializer):
    """docstring for AppointmentSerializer"""
    coach_name = serializers.CharField(source='coach.name')

    class Meta:
        model = Appointment
        fields = ('id', 'schedule_date', 'due_date', 'coach', 'coachee', 'summary', 'condition')

相关问题 更多 >