自定义默认manytomany管理器带参数

时间:2018-02-12 13:44:16

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

以下模型允许我在不调整代码的情况下处理数据库中的翻译以添加语言。

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

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

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字段,以便它以指定的语言返回一个查询集? / p>

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"
            }  
        ],
    }
]

2 个答案:

答案 0 :(得分:0)

我发现了一个不同的功能,无需管理员即可解决我的问题。您可以通过以下方式使用序列化程序方法字段在类视图序列化程序中覆盖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

答案 1 :(得分:0)

更优雅的解决方案!

class MySerializer(serializers.ModelSerializer):
    name = serializers.CharField(source='name_value')

    class Meta:
        model = MyModel
        fields = (
            "id",
            "name",
        )