Кастом По умолчанию многоманый менеджер с параметром

Следующая модель позволяет мне обрабатывать переводы в базе данных, не корректируя код для добавления языка.

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",
        )
Другие вопросы по тегам