Django将逻辑放在视图中vs序列化程序vs模型的最佳方法



在我的当前场景中,放置逻辑的最佳方法是什么?在我的视图中,使用查询+子查询来获取和返回数据。

@action(detail=False, methods=["get"], url_name="inventory")
def inventory(
self, request: Request, *args: None, **kwargs: None
) -> Response:
required = (
ProductionJob.objects.filter(item=OuterRef("pk"))
.order_by()
.filter(status="Pending")
.values("item")
.annotate(
amount_sum=Sum(
"required_item", output_field=FloatField()
)
)
.values("amount_sum")
)
data = (
Item.objects.select_related("supplier")
.prefetch_related("item_jobs")
.annotate(
item_required=Coalesce(
Subquery(required),
0,
output_field=FloatField(),
)
)
.values(
"id",
"article_id",
"composition",
"width_meter",
required_for_jobs=Sum("item_required"),
supplier_name=F("supplier__name"),
)
)
return Response(data=data, status=HTTP_200_OK)

问题是保存此代码的最佳位置是什么。它可以放在模型的QuerySet上,或者如果它应该被移动到序列化程序,那么如何?

谢谢。

我以这种方式将代码移动到序列化程序中。以下是视图:

@action(detail=False, methods=["get"], url_name="inventory")
def inventory(self, request: Request, *args: None, **kwargs: None) -> Response:
queryset = Item.objects.select_related("supplier").prefetch_related(
"item_jobs"
)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data, status=HTTP_200_OK)

和序列化程序:

class ItemInventorySerializer(ModelSerializer[Item]):
supplier_name = SerializerMethodField(required=False)
required_for_jobs = SerializerMethodField(required=False)
class Meta:
model = Item
fields = [
"id",
"article_id",
"composition",
"width_meter",
"required_for_jobs",
"supplier_name",
]
def get_supplier_name(self, obj: Item) -> str:
return obj.supplier.name
def get_required_for_jobs(self, obj: Item) -> Optional[float]:
return obj.item_jobs.aggregate(
required_for_jobs=Coalesce(
Sum("required_item_meters"), 0, output_field=FloatField()
)
).get("required_for_jobs")

问题仍然是什么是更好的方法。将其保留在视图或序列化程序中。非常感谢。

最新更新