【问题标题】:Custom Default manytomany manager with a parameter带参数的自定义默认多线程管理器
【发布时间】:2018-02-12 13:44:16
【问题描述】:

以下模型允许我处理数据库中的翻译,而无需调整代码以添加语言。

class NameString(models.Model)
    en = models.CharField(max_length=55)
    de = models.CharField(max_length=55)

在名为Item的模型中使用示例:

class Item(models.Model):
    name = models.ForeignKey(NameString)

我使用 ReadOnlyModelViewSet 通过 api 查看。它返回以下 json:

"results": [
    {
        "id": 1,
        "name": 3,
    }
]

我想用给定语言的实际名称替换 json 的 name 字段中的 id 值。这可以通过注释查询集来实现,例如:

name_field = 'name__{}'.format(self.language())
queryset = Item.objects.annotate(name_value=F(name_field))

如果我使用带有值 name_value 的序列化程序,我会得到以下 json:

"results": [
    {
        "id": 1,
        "name_value": 'cucumber',
    }
]

我的问题是:我如何编写一个管理器来处理 ItemList 模型中的 items ManyToMany 字段,以便它返回指定语言的查询集?

class ItemList(models.Model):
    items = models.ManyToManyField(Item)

这样我就得到了以下 json:

"results": [
    {
        "id": 1,
        "name": "item_list_1",
        "items" [
            {
                "id": 1,
                "name_value": "cucumber"
            },
            {
                "id": 2,
                "name_value": "apple"
            }  
        ],
    }
]

【问题讨论】:

    标签: json django annotations many-to-many django-custom-manager


    【解决方案1】:

    我发现了一个不同的功能,无需经理就可以解决我的问题。您可以通过以下方式使用序列化器方法字段简单地覆盖类视图序列化器中的 json 字段名称:

    class MySerializer(serializers.ModelSerializer):
        name = serializers.SerializerMethodField('get_name_value')
    
    class Meta:
        model = MyModel
        fields = (
            "id",
            "name",
        )
    
    def get_name_value(self, obj):
        return obj.name_value
    

    【讨论】:

      【解决方案2】:

      更优雅的解决方案!

      class MySerializer(serializers.ModelSerializer):
          name = serializers.CharField(source='name_value')
      
          class Meta:
              model = MyModel
              fields = (
                  "id",
                  "name",
              )
      

      【讨论】:

        猜你喜欢
        • 2021-05-23
        • 2013-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多