【问题标题】:DRF serializer return translated choice field valueDRF 序列化程序返回翻译后的选择字段值
【发布时间】:2020-05-27 14:38:05
【问题描述】:

我正在使用 django-modeltranslation 来翻译 DRF 中的 mo 模型

所以我做了所有说 django-modeltranslation 的文档,它适用于模型字段

但我无法获得选择字段的翻译值

from django.utils.translation import ugettext_lazy as _
class Product(models.Model):

PRODUCT_TYPES = (
    ('food', _('food')),
    ('wear', _('wear'))
)
name = models.CharField(verbose_name='Name', max_length=512, blank=True)
product_type = models.CharField('Type', choices=PRODUCT_TYPES, blank=True, null=True, max_length=16, default='food')

product_name 等字段由 django-modeltranslation 翻译并工作

但我总是在product_type 中得到food

我运行 makemessages 和 compilemessages

msgid "food"
msgstr "еда"

msgid "wear"
msgstr "одежда"

调用 get_product_type_display 无效

class ProductSerializer(serializers.ModelSerializer):
    date = serializers.DateTimeField(read_only=True, format='%d.%m.%Y %H:%M')
    product_type = serializers.SerializerMethodField()

    class Meta:
        model = Product
        fields = ('phone_number', 'name', 'total_bonus', 'card_number', 'id', 'count', 'date', 'product_type',
                  'category')

    def get_product_type(self, obj):
        return obj.get_product_type_display()

【问题讨论】:

  • 您之前是否创建和编译过翻译?
  • 是的,我做了 makemessages 和 compilemessages
  • 您需要在 Product 实例上调用 get_product_type_display()。 docs
  • @monio 为你更新我的问题

标签: django django-rest-framework translate choicefield


【解决方案1】:

您的序列化程序使用 get_FIELDNAME_display() 对象方法:

class ProductSerializer(serializers.ModelSerializer):
    date = serializers.DateTimeField(read_only=True, format='%d.%m.%Y %H:%M')
    product_type = serializers.CharField(source='get_product_type_display', read_only=True)

    class Meta:
        model = Product
        fields = ('phone_number', 'name', 'total_bonus', 'card_number', 'id', 'count', 'date', 'product_type', 'category')

【讨论】:

    【解决方案2】:

    我找到了解决这个问题的方法。需要使用:return _(obj.product_type)

    from django.utils.translation import ugettext_lazy as _
    
    class ProductSerializer(serializers.ModelSerializer):
        date = serializers.DateTimeField(read_only=True, format='%d.%m.%Y %H:%M')
        product_type = serializers.SerializerMethodField()
    
        class Meta:
            model = Product
            fields = ('phone_number', 'name', 'total_bonus', 'card_number', 'id', 'count', 'date', 'product_type',
                      'category')
    
        def get_product_type(self, obj):
            return _(obj.product_type)
    

    【讨论】:

    • 你可以试试我的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    相关资源
    最近更新 更多