我知道關于這個主題還有其他一些主題,但似乎沒有一個解決方案對我有用。
我有一個簡單的 django-treebeard 模型,它允許我通過load_bulk模型方法將嵌套的子級批量添加到父級。
POST 負載本質上是:
items = [
{"data": {"title": "1"}, children: []},
{"data": {"title": "2"}, children: [
{"data": {"title": "2_1"}, children: []},
{"data": {"title": "2_2"}, children: [
{"data": {"title": "2_2_1"}, children: []},
]},
]},
]
payload = {
"parent_id": parent_id,
"items": items
}
我有一個觀點,即采取parent_id與items從物件串列payload,并通過它來load_bulk創建所有嵌套的物件:
Model.load_bulk(items, parent=Model.objects.get(id=parent_id))
它適用于頂級,items但似乎忽略了嵌套的children. 事實上,我什至無法讓get_children序列化程式中的方法(在下面評論)運行。
# models.py
class Item(MP_node):
id = UUIDField()
title = CharField()
# views.py
class BulkCreateView(generics.CreateAPIView):
queryset = Item.objects.all()
serializer_class = BulkCreateSerializer
# serializers.py
class BulkCreateSerializer__item(serializers.ModelSerializer):
class Meta:
model = Item
fields = ["title"]
class BulkCreateSerializer__wrapper(serializers.ModelSerializer):
data = TextBulkCreateSerializer__chapter()
children = serializers.SerializerMethodField()
class Meta:
model = Item
fields = ["data", "children"]
def get_children(self, obj):
# Something wrong here? Print statement doesn't even run
print("get_children")
return BulkCreateSerializer__chapterWrapper(obj).data
class BulkCreateSerializer(serializers.ModelSerializer):
parent_id = serializers.UUIDField(required=True)
chapters = serializers.ListField(
child=BulkCreateSerializer__wrapper(), write_only=True
)
class Meta:
model = Item
fields = ["parent_id", "items"]
def create(self, validated_data):
# validated_data only contains top-level items
print("validated_data", validated_data)
parent_id = validated_data["parent_id"]
parent = Item.objects.get(id=parent_id)
chapters = validated_data["chapters"]
create = Text.load_bulk(chapters, parent=parent)
return {"parent_id": parent_id}
編輯:所以 SerializerMethodField 是只讀的..?
uj5u.com熱心網友回復:
在我使用的是來自drf-writable-nested的包之前,我遇到了同樣的問題。
您可以做的只是將 繼承WritableNestedModelSerializer到您的 ModelSerializer 中。
前任:
class MyModelSerializer(WritableNestedModelSerializer):
...
這個 mixin 允許嵌套關系:
- 一對一欄位()
- ForeingKey()
- 多對多欄位()
- 泛型關系()
uj5u.com熱心網友回復:
djangorestframework-recursive為我簡單地解決了它:
children = serializers.ListField(child=RecursiveField())
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/326801.html
上一篇:決策樹-從特定節點洗掉
