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

标签 python django django-models django-forms django-rest-framework

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

我想优化 get_categories(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)
    ...

这里是repo for test

最佳答案

如果我没猜错,您可以使用 django raw sql 获取必要的数据:

q = """\
SELECT yourappname_category.id,
       yourappname_category.name,
       COUNT(outfit_id) > 0 as added 
FROM yourappname_category
  LEFT JOIN yourappname_category_outfits 
      ON yourappname_category.id = yourappname_category_outfits.category_id 
         AND yourappname_category_outfits.outfit_id=%s
WHERE yourappname_category.owner_id=%s
GROUP BY yourappname_category.id, yourappname_category.name"""

categories = Category.objects.raw(q, [obj.id, user.id])
results = [{'id': c.id, 'name': c.name, 'added': c.added} for c in categories]

关于python - 你能优化这段代码吗? ( Django , python ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46340864/

相关文章:

python - 限制选择

python - 如何从导入的脚本(tkinter、python)正确打开新窗口?

django - 将 Django admin 目录保留在 admin 的默认 url 下是否危险?

python - 哪个更快? `list.pop(0)` 与 `del list[0]` ?

python - 我可以使用 Xcode 3.2 进行 Django 和 Python 网络开发吗?

python - Python、Django 和标准输出的奇怪问题

django - 在 Django 中合并两个模型实例

django - 在 Django 中设计特定于组织的模型的最佳方法?

python - 如何访问模型中外键的​​属性?

Python:将类对象复制到另一个类