Skip to main content
 首页 » 编程设计

python之django 多对多通过

2024年10月01日45oomusou

我正在尝试实现一个教练系统,但我对 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) 

使用以下序列化器我可以获得涉及的主键,但我真的很想在一个请求中获得教练和教练的详细信息。

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

请您参考如下方法:

尝试在 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 

这将生成嵌套表示。

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

class AppointmentSerializer(serializers.HyperlinkedModelSerializer): 
    coach = CoachSerializer() 
    coachee = CoacheeSerializer() 
 
    class Meta: 
        model = Appointment 
        fields = ('id', 'schedule_date', 'due_date', 'coach', 'coachee', 'summary', 'condition') 

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

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')