gpt4 book ai didi

python - 修改 `objects` 以*始终*返回对象的子集?

转载 作者:行者123 更新时间:2023-11-30 22:05:09 30 4
gpt4 key购买 nike

我有一个Events表,其中包含各种类型的事件。我只关心其中一种类型。因此,我编写的每个查询都以

开头
Events.objects.filter(event_type="the_type").\
etc(...).etc(...)`.

显然这是重复的并且很容易忘记。有没有办法使用自定义Manager,以便objects属性始终返回行的特定子集,而无需明确要求?或者任何其他方法将模型限制为行的特定子集?

最佳答案

是的,我们可以设置这样的经理:

from django.db import models

class EventManager(models.Manager):

def get_queryset(self):
return super(EventManager, self).get_queryset().filter(event_type="the_type")

然后将管理器添加到 Event 类中:

class Event(models.Model):

# ...

objects = EventManager()

但请注意,Django 的某些部分不会使用.objects,但._base_manager ,因此仍然返回整个集合。此外,我自己的重写 .objects 管理器的经验是,它会造成很大的危害,例如,如果您想设置所有事件的属性,那么编写 Event.objects.all().update(foo='bar') 只会更新类型为 the_type 的事件,而代码另有建议。

我个人认为最好构建一个具有不同名称的管理器,这至少暗示某些内容被过滤,例如:

class Event(models.Model):

# ...

all_events = models.Manager()
type_events = EventManager()

这里Event.objects已经不存在了,但是你写了Event.all_events,或者Event.type_events,因此代码明确提示您采用哪个子集。

关于python - 修改 `objects` 以*始终*返回对象的子集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53091958/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com