私信  •  关注

Tsang-Yi Shen

Tsang-Yi Shen 最近创建的主题
Tsang-Yi Shen 最近回复了
4 年前
回复了 Tsang-Yi Shen 创建的主题 » 如何使用django rest框架修改多对多集合

这似乎是由于包含唯一约束的嵌套序列化程序模型导致的验证错误,请参阅 post . 根据文章,DRF没有处理这种情况,因为很难意识到序列化程序是否是另一个序列化程序中的嵌套序列化程序。这就是为什么 create() update() 在调用它们之前,从没有进行过验证。

解决这个问题的方法是在 GroupSerializer 具体如下:

class GroupSerializer(serializers.ModelSerializer):
    class Meta:
        model = Group
        fields = ['id', 'name']
        extra_kwargs = {
            'name': {'validators': []},
        }

顺便说一句,在你的 更新() 创建() 代码。首先,你没有 instance.save() 所以在整个过程完成后,实例不会被更新。其次是 groups 只是一个字典列表,不应该这样添加对象。以下是基于操作代码的修改:

    def update(self, instance, validated_data):
        data = validated_data.copy()
        groups = data.pop('groups', [])
        for key, val in data.items():
            setattr(instance, key, val)
        instance.save()                     # This will indeed update DB values

        group_ids = [g['id'] for g in groups]
        instance.groups.clear()
        instance.groups.add(*group_ids)     # Add all groups once. Also you can replace these two lines with
                                            # instance.groups.set(*group_ids)
        return instance
4 年前
回复了 Tsang-Yi Shen 创建的主题 » Django分组并按权重聚合

一种方法是 Conditional Expressions 要确定查询中的权重值,这意味着您可以首先构造 Case 表达式:

from django.db.models import IntegerField

when_list = [When(city=w['city'], then=w['weight']) for w in weights]
case_params = {'default': 1, 'output_field': IntegerField()}

Model.objects.values('date') \
    .annotate(
        weighted_car_crashes=Sum(
            F('car_crashes') * Case(*when_list, **case_params)
    ))