如何从 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'
)
我有以下结构:
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'
)