django更新模型,同时删除额外的kwargs

时间:2016-03-02 16:07:58

标签: django models

我有一个Row类和一个SpottedPub模型。它们几乎相同,只是Row有一些额外的字段。

我需要做的是从spottedpub对象属性优雅地更新row字段。我试过这个

spotted_pubs = SpottedPub.objects.filter(notification__rule__suite__campaign=self,
                                         name=particular_row.name)
if spotted_pubs.all():
    spotted_pubs.update(**row.__dict__)

但是我收到一条错误消息,说我将过多的kwargs传递给update()

FieldDoesNotExist: SpottedPub has no field named 'profit_weight'

有没有办法放弃那些与字段不对应的kwargs?

我尝试编写自定义管理器

class CustomSpottedPubManager(models.Manager):

    def update_drop_fields(self, **fields):
        queryset = super(CustomSpottedPubManager, self).get_queryset()
        print(queryset)
        # drop unwanted fields here
        queryset.update(**fields)

并将其附加到模型

class SpottedPub(BaseUserObject):
    objects = CustomSpottedPubManager()

update_drop_fields()方法没有被调用,因为我在过滤后已经访问了此方法:

filter(notification__rule__suite__campaign=self,
                                         name=particular_row.name)

1 个答案:

答案 0 :(得分:0)

您创建update_drop_fields并过滤字段的想法看起来不错。

您可以使用自定义update_drop_fields()方法

创建查询集
class CustomSpottedPubQueryset(models.QuerySet):

    def update_drop_fields(self, **fields):
        return self.update(**fields)

然后create a manager with the queryset methods

class SpottedPub(BaseUserObject):
    objects = CustomSpottedPubQueryset.as_manager()