1

我有以下模型:

class Hospitalization(models.Model):
    patient = models.ForeignKey(Patient)
    room = models.ForeignKey(Room)
    date_in = models.DateField()
    date_out = models.DateField(blank=True, null=True)
    ...

我想列出目前的住院情况。所以我添加了一个@property 'is_current':

@property
def is_current(self):
    today = date.today()
    if self.date_in and self.date_out:
        if self.date_in <= today and self.date_out >= today:
            return True
    if self.date_in and not self.date_out:
        if self.date_in <= today:
            return True

但是,当尝试从我的views.py 中的过滤器调用该属性时,我收到以下错误: *Cannot resolve keyword 'is_current' into field。选项包括:date_in、date_out、id、患者、房间*

然后我想我可以和经理一起做这件事。所以我添加了一个经理:

class Hospitalization(models.Model):
    def get_query_set(self):
        today = date.today()
        if self.date_in and self.date_out:
            return qs.filter(date_in__lte=today, date_out__gte=today)
        if self.date_in and not self.date_out:
            return qs.filter(date_in__lte=today)

但这也不起作用: *AttributeError: 'HospitalizationManager' 对象没有属性 'date_in'*

Django推荐的解决方法是什么?

4

1 回答 1

4

您的 有各种问题Manager

  • 你是子类化Model,不是Manager
  • 您正在使用您的模型属性,就好像它们属于Manager而它们不属于
  • 您的自定义get_queryset没有调用超类方法,因此它使用了未定义的qs属性。

定义经理的正确方法是:

class CurrentHospitalizationManager(models.Manager):
    def get_query_set(self):
        qs = super(CurrentHospitalizationManager, self).get_query_set()
        today = date.today()    
        return qs.filter(
            # we can use Q objects here to check if the date_out exists or not
            # and compare against the current date if necesary
            models.Q(date_out__isnull=True) | models.Q(date_out__gte=today),
            date_in__lte=today                
        )

然后您应该将管理器分配给模型上的类属性,如下所示

class Hospitalization(models.Model):
    current_objects = CurrentHospitalizationManager()
    ...

并像这样在您的代码上使用它:

Hospitalization.current_objects.get(...) # or filter, or whatever

我不建议您将此自定义管理器分配给您的默认管理器 attr ( objects),因为您将无法访问Hospitalization非“当前”的实例。

客户经理的文件

于 2013-09-01T19:54:14.220 回答