【问题标题】:Getting an Aggregate Value from a Many-to-Many Field inside a Serializer从序列化程序中的多对多字段获取聚合值
【发布时间】:2021-06-15 07:56:24
【问题描述】:

我们有一个生成响应的 API 端点。但是,我们希望聚合一些数据并向序列化程序添加一个额外的字段。

  {
        "id": 61,
        "not_owned_value": # This is what we're trying to get (Aggregate best_buy_price from not_owned_inventory PlayerProfiles)
        "not_owned_inventory": [ # PlayerProfile objects
            "29666196ed6900f07fc4f4af4738bffe",
            "0ff73ca20cd787c5b817aff62e7890da",
            "99d4eaef9991695d7ad94b83ad5c5223",
            "6fcabe9f9c8a95980923530e7d7353a7",
            "80b34c84a6e5ed25df112c11de676adc",
            "0a4c5b96474f0584519d1abc4364d5a2",
            "9ed1f55ac4f3b402b1d08b26870c34a6",
         ]
  }

这是models.py

class PlayerProfile(models.Model):
    card_id = models.CharField(max_length=120, unique=True, primary_key=True)
    name = models.CharField(max_length=120, null=True)

class PlayerListing(models.Model):
    player_profile = models.OneToOneField(
        PlayerProfile,
        on_delete=models.CASCADE,
        null=True)
    best_buy_price = models.IntegerField(null=True)

class InventoryLiveCollection(models.Model):
    not_owned_inventory = models.ManyToManyField(PlayerProfile, related_name="not_owned_inventory")

这里是serializer.py

class InventoryLiveCollectionSerializer(serializers.ModelSerializer):
    not_owned_inventory = PlayerProfileAndListingForNesting(read_only=True, many=True)

    class Meta:
        model = InventoryLiveCollection
        fields = (
            'id',
            'date',
            'not_owned_value', # Trying to get this
            'not_owned_inventory',
        )

如何聚合属于特定 InventoryLiveCollection__not_owned_inventory 的 player_profile 对象的 best_buy_price?

【问题讨论】:

    标签: django serialization django-rest-framework


    【解决方案1】:

    你可以试试这个。

     from django.db.models import Sum
    
     not_owned_value = serializers.SerializerMethodField()
        
     def get_not_owned_value(self, obj):
         value = obj.not_owned_inventory.all().aggregate(total=Sum('playerlisting__best_buy_price'))
         return value['total']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-14
      • 2015-08-26
      • 2022-01-16
      • 1970-01-01
      • 2018-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多