Кастом По умолчанию многоманый менеджер с параметром
Следующая модель позволяет мне обрабатывать переводы в базе данных, не корректируя код для добавления языка.
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_field = 'name__{}'.format(self.language())
queryset = Item.objects.annotate(name_value=F(name_field))
Если я использую сериализатор со значением name_value, я получаю следующий json:
"results": [
{
"id": 1,
"name_value": 'cucumber',
}
]
Мой вопрос: как мне написать менеджер, который будет обрабатывать поле ItemsTanyMany в модели ItemList, чтобы оно возвращало набор запросов на указанном языке?
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 ответа
Я узнал о другом функционале, который решил мою проблему без необходимости менеджера. Вы можете просто перезаписать имена полей 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",
)