Skip to main content
 首页 » 编程设计

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

2024年10月01日34虾米姐

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

我想优化 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]