簡體   English   中英

字段序列化器 Django

[英]Field Serializers Django

我有一個帶有一些自定義字段的序列化程序,這些字段取決於特定查詢。 問題在於,每次序列化程序嘗試獲取該字段的值時,它都必須對 DB 執行查詢。 如果序列化器是 many=True 序列化器呢?

class ExampleSerializer(serializers.ModelSerializer):

  field_one = serializers.SerializerMethodField()
  field_two = serializers.SerializerMethodField()
  field_three = serializers.SerializerMethodField()
  .
  .
  .

  def get_field_one(self, obj):
    try:
      # This is where i do the query
      query_result = obj.objects.filter(filter=self.context.get("filter").first()
      if query_result:
        # Do field one stuff
    except Exception:
      # Do exception stuff

  def get_field_two(self, obj):
    try:
     # This is where i do the query
     query_result = obj.objects.filter(filter=self.context.get("filter").first()
     if query_result:
        # Do field two stuff
    except Exception:
      # Do exception stuff

  def get_field_three(self, obj):
    try:
     # This is where i do the query
     query_result = obj.objects.filter(filter=self.context.get("filter").first()
     if query_result:
        # Do field three stuff
    except Exception:
      # Do exception stuff

有沒有辦法將該結果存儲在序列化程序的屬性中? 另外,如果我在序列化程序字段之一中設置了一個值,我如何在同一個序列化程序中的另一個字段上檢索和執行一些數學運算?

如果我有選擇,我會在一個方法中完成所有這些計算邏輯

class ExampleSerializer(serializers.ModelSerializer):
    generic_field = serializers.SerializerMethodField()

    def get_generic_field(self, obj):
        # first query
        first_result = FirstModel.objects.filter(
            filter=self.context.get("filter")
        ).aggrgate(sum=Sum('any_field'))['sum']
        # second query
        second_model_instance = SecondModel.objects.filter(
            some_value__gte=first_result).first()

        second_result = second_model_instance.some_field_name

        # and so on

        # at last, return these results as
        return {
            "first_result": first_result,
            "second_result": second_result,
            # and so on
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM