带有参数的自定义默认 manytomany 管理器
Custom Default manytomany manager with a parameter
以下模型允许我处理数据库中的翻译,而无需调整代码以添加语言。
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 查看。其中returns以下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 字段,以便它 returns 指定语言的查询集?
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"
}
],
}
]
我发现了一个不同的功能,它可以在不需要经理的情况下解决我的问题。您可以通过以下方式使用序列化程序方法字段简单地覆盖 class 视图序列化程序中的 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
更优雅的解决方案!
class MySerializer(serializers.ModelSerializer):
name = serializers.CharField(source='name_value')
class Meta:
model = MyModel
fields = (
"id",
"name",
)
以下模型允许我处理数据库中的翻译,而无需调整代码以添加语言。
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 查看。其中returns以下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 字段,以便它 returns 指定语言的查询集?
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"
}
],
}
]
我发现了一个不同的功能,它可以在不需要经理的情况下解决我的问题。您可以通过以下方式使用序列化程序方法字段简单地覆盖 class 视图序列化程序中的 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
更优雅的解决方案!
class MySerializer(serializers.ModelSerializer):
name = serializers.CharField(source='name_value')
class Meta:
model = MyModel
fields = (
"id",
"name",
)