django 避免必须传递参数来更新

bq9c1y66  于 2023-03-24  发布在  Go
关注(0)|答案(1)|浏览(88)

在django中是否可以替换:

MyModel.objects.get_stuff_to_close_query_set(time).update(
    status="closed", 
    open_time=None,
    opener=None
)

与:

MyModel.objects.my_custom_query_set(time).close()

其中close()与第一条语句中的update做的事情相同?如果是这样,我如何实现close()?
此外,是否可以通过执行以下操作来隐藏查询集:

MyModel.objects.close_stuff(time)
voase2hg

voase2hg1#

你可以通过子类化QuerySet来实现。例如:

from django.db.models import QuerySet

class MyModelQuerySet(QuerySet):
    def close(self):
        return self.update(status='closed', open_time=None, opener=None)

    def close_stuff(self, *args, **kwargs):
        return self.get_stuff_to_close_query_set(*args, **kwargs).close()

    def get_stuff_to_close_query_set(self, time):
        self.filter(…)

然后我们可以将其插入MyModel

class MyModel(models.Model):
    # …
    objects = MyModelQuerySet.as_manager()

相关问题