Django models 我需要显示与同一型号有多对多关系的相关文件。Django休息架
我正在尝试创建一个相关的产品字段,我在模型中添加了多对多关系字段,并将其设置为self,因为我将手动选择相关的产品Django models 我需要显示与同一型号有多对多关系的相关文件。Django休息架,django-models,django-rest-framework,django-serializer,Django Models,Django Rest Framework,Django Serializer,我正在尝试创建一个相关的产品字段,我在模型中添加了多对多关系字段,并将其设置为self,因为我将手动选择相关的产品 class ProductsSerializer(serializers.ModelSerializer): images = ImagesSerializer(many=True) color = ColorSerializer(many=False) class Meta: fields = ( 'url',
class ProductsSerializer(serializers.ModelSerializer):
images = ImagesSerializer(many=True)
color = ColorSerializer(many=False)
class Meta:
fields = (
'url',
'id',
"code",
"sku",
"title",
"slug",
"state",
"old_price",
"price",
"valid",
"in_stock",
"category",
"related_products",
"color",
"images",
"video",
"description",
"fabric",
"model_size_info",
)
model = Products
我不能引用api json中获取产品详细信息所需的相同序列化程序。我找不到办法
提前感谢大家的帮助。方法-1:覆盖
\uuu init\uuuu()
方法class ProductsSerializer_Temp(serializers.ModelSerializer):
images = ImagesSerializer(many=True)
class Meta:
fields = (
'url',
'id',
"title",
"images",
)
model = Products
class ProductsSerializer(ProductsSerializer_Temp):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields.update(
{"related_products": ProductsSerializer_Temp()}
)
首先,我认为应该使用类似的方法来防止递归
class DynamicFieldsModelSerializer(serializers.ModelSerializer):
"""
A ModelSerializer that takes an additional `fields` argument that
controls which fields should be displayed.
"""
def __init__(self, *args, **kwargs):
# Don't pass the 'fields' arg up to the superclass
fields = kwargs.pop('fields', None)
# Instantiate the superclass normally
super(DynamicFieldsModelSerializer, self).__init__(*args, **kwargs)
if fields is not None:
# Drop any fields that are not specified in the `fields` argument.
allowed = set(fields)
existing = set(self.fields)
for field_name in existing - allowed:
self.fields.pop(field_name)
然后,您可以使用SerializerMethodField
,还可以在相关产品中指定所需的字段(“不要传递相关产品以防止递归”):
这是我遇到的解决办法。
我创建了另一个序列化程序
class ProductsSerializerTemp(serializers.ModelSerializer):
color = ColorSerializer(many=False)
class Meta:
fields = (
"color",
"url"
)
model = Products
然后我把它交给了我原来的序列化程序
class ProductsSerializer(serializers.ModelSerializer):
images = ImagesSerializer(many=True)
color = ColorSerializer(many=False)
related_products = ProductsSerializerTemp(many=True)
class Meta:
fields = (
'url',
'id',
"code",
"sku",
"title",
"slug",
"state",
"old_price",
"price",
"valid",
"in_stock",
"category",
"related_products",
"color",
"images",
"video",
"description",
"fabric",
"model_size_info",
)
model = Products
我几乎完成了这项工作,我不确定这是否是最好的解决方案,但效果很好。我尝试过,但这是递归。我想我忘了提到相关的产品也会有相关的产品在里面,所以我需要在这一节中小心。我也可以使用深度属性,但我需要这些产品的颜色,我已经在当前代码中得到了,所以深度需要为2,这是相当少的使用,将需要更长的时间来响应,希望保持最小并且有效。“\uuu init_uuuuuuuuo()得到了一个意外的关键字参数“fields”它不可用请注意类产品序列化程序(DynamicFieldsModelSerializer):
您的序列化程序应该继承自DynamicFieldsModelSerializer
我找到了解决方案。我创建了另一个序列化程序,并将其设置为检索信息,让我将其作为答案。
class ProductsSerializer(serializers.ModelSerializer):
images = ImagesSerializer(many=True)
color = ColorSerializer(many=False)
related_products = ProductsSerializerTemp(many=True)
class Meta:
fields = (
'url',
'id',
"code",
"sku",
"title",
"slug",
"state",
"old_price",
"price",
"valid",
"in_stock",
"category",
"related_products",
"color",
"images",
"video",
"description",
"fabric",
"model_size_info",
)
model = Products