如何从 Django 序列化器中外键关系之上的 ManyToMany 关系访问字段?

How to access field from ManyToMany relation on top of Foreign key relation in a django serializer?

我有以下结构:

class Model_1():
    model_2_ref = models.ForeignKey(to="Model_2", null=True, on_delete=models.SET_NULL)
    model_1_field_1 = models.CharField(max_length=120)
    ...

class Model_2():
    model_2_field_1 = models.CharField(max_length=120)
    model_2_field_2 = models.CharField(max_length=120)
    ....

class Model_3():
    model_2_ref = models.ManyToManyField(to="Model_2", related_name="model_2_rel_name")
    model_3_field_1 = models.CharField(max_length=120)
    user_id = models.Integer()
    ....

Model_1 的每条记录仅与 Model_2 的一条记录相关。此外,Model_2 的每条记录仅与当前用户的 Model_3 的一条记录相关。序列化程序将由视图集使用,该视图集通过 user_id 过滤来自 model_3 的匹配项,将其转换为各种一对一关系。

我有一个 Model_1 的序列化程序,我想在其中包含 Model_2 和 Model_3.

的相关字段

理论上,这是我想要实现的:

class Model_1_Serializer():
    model_1_field_1 = serializers.CharField()
    model_2_field_1 = serializers.CharField(source='model_2_ref.model_2_field_1')
    model_2_field_2 = serializers.CharField(source='model_2_ref.model_2_field_1')
    model_3_field_1 = serializers.CharField(source='model_2_ref.model_3_ref.model_3_field_1')

对于 model_3_field_1 此语法无效,但对于模型 2 的字段有效。如何从 Model_1 的序列化程序访问 Model_3 的相关字段?

也许类似(未测试)?

models.py

class Model2(...):
    
    # this method returns the first model_3 instance or None:
    @property
    def model_3_single_ref(self): return self.model_3_ref.first() 


class Model3(...):
    
    model_3_field_1 = models.CharField(...)
    model_2_ref = models.ForeignKey(..., related_name = 'model_3_ref')

serializers.py

class Model_1_Serializer(...):

    # list of model_3_field_1s
    model_3_field_1s = serializers.SlugRelatedField(
        many = True,
        read_only = True,
        slug_field = 'model_3_field_1',
        source = 'model_2_ref.model_3_ref'
    )
    
    # model_3_field_1 as just a string:
    model_3_field_1 = serializers.SlugRelatedField(
        read_only = True,
        slug_field = 'model_3_field_1',
        source = 'model_2_ref.model_3_single_ref'            
    )