Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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
你能优化这个代码吗?(Django,python)_Python_Django_Django Models_Django Forms_Django Rest Framework - Fatal编程技术网

你能优化这个代码吗?(Django,python)

你能优化这个代码吗?(Django,python),python,django,django-models,django-forms,django-rest-framework,Python,Django,Django Models,Django Forms,Django Rest Framework,我正在添加“添加”字段,以检查用户的帖子(装备)添加到了哪些类别。这听起来很可怕,所以让我们深入了解代码 我想优化get_类别(self,obj)功能。 class CategorySerializer(serializers.ModelSerializer): added = serializers.BooleanField() class Meta: model = Category fields = ( 'id',

我正在添加“添加”字段,以检查用户的帖子(装备)添加到了哪些类别。这听起来很可怕,所以让我们深入了解代码

我想优化get_类别(self,obj)功能。

class CategorySerializer(serializers.ModelSerializer):
    added = serializers.BooleanField()
    class Meta:
        model = Category
        fields = (
            'id',
            'name',
            'added'
        )


class OutfitDetailSerializer(serializers.ModelSerializer):

    def get_categories(self, obj):
        user = self.context['request'].user
        categories = Category.objects.filter(owner=user)
        added = categories.extra(select={'added': '1'}).filter(outfits__pk=obj.pk)
        added = list(added.values('added', 'name', 'id'))
        added_f = categories.extra(select={'added': '0'}).exclude(outfits__pk=obj.pk)
        added_f = list(added_f.values('added', 'name', 'id'))
        categories = added + added_f
        return CategorySerializer(categories, many=True).data
输出如下

"categories": [{
        "id": 1,
        "name": "Gym",
        "added": true
    }, {
        "id": 2,
        "name": "School",
        "added": false
    }, {
        "id": 3,
        "name": "hollymo",
        "added": true
    }, {
        "id": 4,
        "name": "Normal",
        "added": false
    }, {
        "id": 6,
        "name": "New Category",
        "added": false
    }
]
这是models.py

class Outfit(models.Model):
    ...
    user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True)
    content = models.CharField(max_length=30)
    ...

class Category(models.Model):
    name = models.CharField(max_length=20)
    owner = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True)
    outfits = models.ManyToManyField(Outfit, related_name="categories", blank=True)
    main_img = models.ImageField(
                            upload_to=upload_location_category,
                            null=True,
                            blank=True)
    ...

这里是

如果我没弄错,您可以通过以下方式获得必要的数据:


如果我正确理解了您的用例,您只需要“检查用户的帖子(装备)添加到了哪些类别”。因此,您只需要返回added=true的值,对吗?然后你可以把添加的钥匙留在外面

例如:

"categories": [{
        "id": 1,
        "name": "Gym"
    }, {
        "id": 3,
        "name": "hollymo"
    }
]
如果是这样,您可以使用:

import Category from category.models

class CategoriesSerializer(serializers.ModelSerializer):

    class Meta:
        model = Category
        fields = ('id', 'name')

class OutfitDetailSerializer(serializers.ModelSerializer):
    categories = CategoriesSerializer(many=True)
如果您的用例是显示所有类别的列表,然后只对当前装备添加到的类别执行一些操作,我建议您执行2个API调用,而不是当前逻辑;一个是我上面提供的答案,另一个是所有类别。然后在前端添加逻辑作为其表示层逻辑


我当然会尽量避免在Django中进行原始SQL查询,因为这会降低迁移的目的,而且很少是必要的。

最好将您的模型添加到当前的问题中,让其他人更容易阅读。好吧,只需使用
“added”(添加)
“来演示一下
类别
:false
将出现在您的查询中?你的逻辑是什么?OP通过
added\u f=categories.extra(select={'added':'0'}).exclude(outfights\uu pk=obj.pk)
@devxplorer你能解释一下吗?@BearBrown它会留下带有指定id的装备,然后按类别分组并对类别中的装备项目进行计数,如果类别中没有装备,它会将计数(装备id)>0作为false。但也许我没有完全理解作者的意思wants@JohnBaek请看上面的评论,告诉我你试过了吗?它返回了正确的结果吗?@devxplorer我测试了你的解决方案,它是错误的,问题中的代码工作正常,但目前OP想知道是否有一种方法可以最小化对数据库的查询。我明白了,因此,使用原始SQL的答案可能是正确的(我当然没有试图抨击这个答案!)。但我认为问题中的代码可能不是在性能方面如何最好地设置API体系结构,因此我建议重新考虑输出,而不是尝试创建输出。
import Category from category.models

class CategoriesSerializer(serializers.ModelSerializer):

    class Meta:
        model = Category
        fields = ('id', 'name')

class OutfitDetailSerializer(serializers.ModelSerializer):
    categories = CategoriesSerializer(many=True)