Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django rest框架,使用Django hvad转换模型_Python_Django_Django Rest Framework_Django Hvad - Fatal编程技术网

Python Django rest框架,使用Django hvad转换模型

Python Django rest框架,使用Django hvad转换模型,python,django,django-rest-framework,django-hvad,Python,Django,Django Rest Framework,Django Hvad,我有型号产品: class Product(TranslatableModel): name = models.CharField(max_length=255, unique=True) translations = TranslatedFields( description=models.TextField(), ) 在产品详细信息的管理中,我有带有语言的选项卡。例如,选项卡EN、CZ,每个选项卡都包括disctiption。所以PUT请求看起来像

我有型号
产品

class Product(TranslatableModel):
    name = models.CharField(max_length=255, unique=True)

    translations = TranslatedFields(
        description=models.TextField(),
    )
在产品详细信息的管理中,我有带有语言的选项卡。例如,选项卡EN、CZ,每个选项卡都包括
disctiption
。所以PUT请求看起来像:

{
    'product': '1',
    'id': 1,
    'name': 'Name', 
    'translations': {
        'cz': {'desctiption': 'Description cz'},
        'en': {'desctiption': 'Description en'}
    }
}
我建立在一个允许我做这个请求的地方

在序列化程序中,我有:

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”这样的语言,过滤该查询并获得如下结果:

[
    {
        id: 1
        name: "name"
        descritpion: "descritpion"
    },
    ....
]

谢谢大家!

我最可能实现的方式是:

models.py

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

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
序列化程序.py

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', ]
url.py

   from rest_framework import routers
   router = routers.DefaultRouter()
   router.register(r'product', ProductViewSet, base_name='api-product')
   ...
结果: 你会得到:

你会得到:

{
    "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"
        }
    ]
}
{
    "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也更改语言,请使用: url.py

改变语言

 http://192.168.1.108/zh-hans/api/product/

您将获得:

{
    "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"
        }
    ]
}

django hvad github repo@spectras所有者的答复:

如果我理解得很好,您希望为集合端点和项端点使用不同的序列化表单。也就是说,GET-1、PUT、POST将使用mixin,而GET-many将不使用。 为此,您需要两个不同的序列化程序:

  • 你创造的那个
  • 另一个可能是,例如,
    类ProductItemSerializer(TranslateableModelSerializer):
  • 另一个可能是,例如, 类ProductItemSerializer(TranslateableModelSerializer):。。。 因此,您可以向ModelViewSet添加一个方法,该方法根据请求类型动态选择序列化程序类:

    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端使用的方法是为产品模型创建两个视图集,一个读写视图集支持翻译(使用ProductSerializer),另一个只读视图集不支持翻译(使用ProductItemSerializer)


    同样,我通常只有不知道翻译的序列化程序,并添加一个知道翻译的/api/product/details/endpoint。这样,在客户端进入编辑/详细模式时,我只需处理dict对象的复杂性。

    Hi!谢谢你提供有用的信息!
    {
        "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"
            }
        ]
    }
    
    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