首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django rest框架,用django-hvad翻译模型

Django rest框架,用django-hvad翻译模型
EN

Stack Overflow用户
提问于 2017-08-17 13:59:45
回答 2查看 1.5K关注 0票数 1

我有Product模型

代码语言:javascript
复制
class Product(TranslatableModel):
    name = models.CharField(max_length=255, unique=True)

    translations = TranslatedFields(
        description=models.TextField(),
    )

在产品细节管理方面,我有语言标签。例如,制表符EN,CZ,每个都包括disctiption。因此,PUT请求看起来是:

代码语言:javascript
复制
{
    'product': '1',
    'id': 1,
    'name': 'Name', 
    'translations': {
        'cz': {'desctiption': 'Description cz'},
        'en': {'desctiption': 'Description en'}
    }
}

我是在django-hvad TranslationsMixin创建的,它允许我完成这个请求。

在序列化程序中有:

代码语言:javascript
复制
class ProductTranslationSerializer(serializers.ModelSerializer):
    class Meta:
        exclude = ['description']


class ProductSerializer(TranslationsMixin, serializers.ModelSerializer):
    class Meta:
        model = Product
        translations_serializer = ProductTranslationSerializer
        fields = (
            'name', 
            'description',
        )

问题是,对于此请求,ModelViewSet的外观如何?我可以选择像' language _code=en‘这样的语言,过滤这个查询并得到如下内容:

代码语言:javascript
复制
[
    {
        id: 1
        name: "name"
        descritpion: "descritpion"
    },
    ....
]

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-18 00:39:32

我最有可能做到的方法是:

models.py

代码语言:javascript
复制
class Product(TranslatableModel):
    category = models.ForeignKey('product.ProductCategory',
                                 related_name='product_category',
                                 null=True,
                                 on_delete=models.SET_NULL,
                                 verbose_name=u'category')
    cover = models.ImageField(upload_to=product_cover,
                              null=True,
                              verbose_name=u'cover')
    translations = TranslatedFields(
        title=models.CharField(max_length=100,
                               null=True,
                               verbose_name=u'title'),
        summary=models.TextField(null=True,
                                 verbose_name=u'summary'),
        model=models.CharField(max_length=255,
                               null=True,
                               blank=True,
                               verbose_name=u'model'),
        price=models.DecimalField(default=0.00,
                                  max_digits=10,
                                  decimal_places=2,
                                  blank=True,
                                  validators=[MinValueValidator(0)],
                                  verbose_name=u'price'),
        content=models.TextField(verbose_name=u'content'),
        publish_time=models.DateTimeField(default=timezone.now,
                                          verbose_name=u'发布publish_time')

    )
    view_times = models.IntegerField(default=0,
                                     verbose_name=u'view_times ')

views.py

代码语言:javascript
复制
class ProductViewSet(ModelViewSet):
    serializer_class = ProductListSerializer

    def get_queryset(self):
        if 'language_code' in self.request.GET:
            language_code = self.request.GET.get('language_code')
            queryset = Product.objects.language(language_code).order_by('-id')
        else:
            queryset = Product.objects.language().order_by('-id')
        return queryset

serializers.py

代码语言:javascript
复制
class ProductCategorySerializer(TranslatableModelSerializer):
    class Meta:
        model = ProductCategory
        fields = '__all__'



class ProductListSerializer(TranslatableModelSerializer):
    category = ProductCategorySerializer(read_only=True)

    class Meta:
        model = Product
        exclude = ['is_abandon', 'content', ]

urls.py

代码语言:javascript
复制
   from rest_framework import routers
   router = routers.DefaultRouter()
   router.register(r'product', ProductViewSet, base_name='api-product')
   ...

结果:你得到的代码=zh-hans

代码语言:javascript
复制
{
    "count": 1,
    "page_num": 1,
    "page_no": 1,
    "next": "",
    "previous": "",
    "results": [
        {
            "id": 2,
            "category": {
                "id": 2,
                "create_time": "2017-08-10 16:49:41",
                "update_time": "2017-08-18 08:56:02",
                "name": "测试",
                "language_code": "zh-hans"
            },
            "create_time": "2017-08-18 08:53:46",
            "update_time": "2017-08-18 08:56:28",
            "cover": "http://192.168.1.108/media/product/20170818-085346-518_59.jpg",
            "view_times": 0,
            "title": "标题",
            "summary": "简介",
            "model": null,
            "price": "90.00",
            "publish_time": "2017-08-18 08:53:00",
            "language_code": "zh-hans"
        }
    ]
}

你得到的code=en

代码语言:javascript
复制
{
    "count": 1,
    "page_num": 1,
    "page_no": 1,
    "next": "",
    "previous": "",
    "results": [
        {
            "id": 2,
            "category": {
                "id": 2,
                "create_time": "2017-08-10 16:49:41",
                "update_time": "2017-08-18 08:56:02",
                "name": "测试",
                "language_code": "zh-hans"
            },
            "create_time": "2017-08-18 08:53:46",
            "update_time": "2017-08-18 09:00:23",
            "cover": "http://192.168.1.108/media/product/20170818-085346-518_59.jpg",
            "view_times": 0,
            "title": "title",
            "summary": "summary",
            "model": "model",
            "price": "91.00",
            "publish_time": "2017-08-18 08:56:04",
            "language_code": "en"
        }
    ]
}

这样,fk将不会改变语言,如果您也希望fk更改语言,请使用: urls.py

代码语言:javascript
复制
urlpatterns += i18n_patterns(
    '''
    url(r'^api/', include(router.urls)),
    prefix_default_language=False,
)

改变语言

代码语言:javascript
复制
 http://192.168.1.108/zh-hans/api/product/

代码语言:javascript
复制
 http://192.168.1.108/en/api/product/

你的遗嘱:

代码语言:javascript
复制
{
    "count": 1,
    "page_num": 1,
    "page_no": 1,
    "next": "",
    "previous": "",
    "results": [
        {
            "id": 2,
            "category": {
                "id": 2,
                "create_time": "2017-08-10 16:49:41",
                "update_time": "2017-08-18 08:56:02",
                "name": "test",
                "language_code": "en"
            },
            "create_time": "2017-08-18 08:53:46",
            "update_time": "2017-08-18 09:00:23",
            "cover": "http://192.168.1.108/media/product/20170818-085346-518_59.jpg",
            "view_times": 0,
            "title": "title",
            "summary": "summary",
            "model": "model",
            "price": "91.00",
            "publish_time": "2017-08-18 08:56:04",
            "language_code": "en"
        }
    ]
}
票数 1
EN

Stack Overflow用户

发布于 2017-08-18 08:31:36

django-hvad github repo @谱所有人的答复:

如果我理解得很好,您希望对集合端点和项端点使用不同的序列化形式。也就是说,GET-1,PUT,POST将使用混合翻译,而GET-许多则不会。为此,需要两个有两个不同的序列化程序:

  1. 你创造的那个
  2. 另一个会是,例如,class ProductItemSerializer(TranslatableModelSerializer): .

另一个,例如,ProductItemSerializer(TranslatableModelSerializer):类.有鉴于此,您可以向ModelViewSet添加一个方法,该方法根据请求类型动态地选择序列化程序类:

代码语言:javascript
复制
class SomeModelViewSet(ModelViewSet):
    # serializer_class = not needed, we use the method instead
    def get_serializer_class(self):
        if self.action == 'list':
            return ProductItemSerializer
        return ProductSerializer

另一种可能更容易在Javascript端使用的方法是为Product制作两个视图集,一个读写视图集(使用ProductSerializer)和一个只读视图集(使用ProductItemSerializer)。

同样,我通常只有不懂翻译的序列化程序,并添加了一个/api/product/details/终结点,它具有翻译能力。这样,在客户端进入编辑/详细模式时,我只需要处理dict对象的复杂性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45737206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档