如何在视图中访问Django方法

时间:2013-02-05 17:58:58

标签: python django

我在Django中有一个模型,我在视图中似乎无法访问该方法。这是模型:

class Realtor(models.Model):
    user = models.OneToOneField(User)
    team = models.ForeignKey(RealtorTeam, blank=True, null=True, default=None)
    is_showing_realtor = models.BooleanField(default=False)
    is_listing_realtor = models.BooleanField(default=False)

    def type(self):
        if self.is_showing_realtor and self.is_listing_realtor:
            return 'Showing and Listing'
        elif self.is_showing_realtor:
            return 'Showing'
        elif self.is_listing_realtor:
            return 'Listing'
        else:
            return ''

现在,在视图中,我尝试查询模型,包括方法,如下所示:

q = Realtor.objects.all()
q = q.filter(user__first_name__icontains=first)
q = q.filter(user__last_name__icontains=last)
q = q.filter(team__name__icontains=team)
q = q.filter(user__email__icontains=email)
q = q.filter(type__icontains=type)

我得到的错误是Cannot resolve keyword 'type' into field. Choices are...。我查看了一些stackoverflow问题,并阅读了更多的Django文档,我看到在模型中添加这样的字段:

type_display = (type,)

但那没用。我是否必须查询is_showing_realtor和is_listing_realtor?有没有办法查询方法?

更多信息

我们正在使用Django_tables2来显示模型表。我们可以使用它来访问type方法,如下所示:

class RealtorTable(tables.Table):
    id = tables.Column()
    first_name = tables.Column(accessor='user.first_name', order_by='user.first_name')
    last_name = tables.Column(accessor='user.last_name', order_by='user.last_name')
    team = tables.Column()
    email = tables.Column(accessor='user.email', order_by='user.email')
    type = tables.Column(order_by='is_showing_realtor')

但是,仍然无法将其传递给视图。

2 个答案:

答案 0 :(得分:2)

typebuilt-in function python的名称,django也是如此。我建议您将函数重命名为listing_type,以避免任何冲突。

特别是这一行

type_display = (type,)

可能没有做你想象的那样。

reptilicus是正确的,我没有发现非字段属性的过滤器,这没有意义。您可以将listing_type设置为CharField设置为choices=,然后设置一些自定义save()逻辑,以便在模型更改时设置它 - 或者您可以使用property }

@def listing_type():
    doc = "The listing_type property."
    def fget(self):
        if self.is_showing_realtor and self.is_listing_realtor:
            return 'Showing and Listing'
        elif self.is_showing_realtor:
            return 'Showing'
        elif self.is_listing_realtor:
            return 'Listing'
        else:
            return ''
    def fset(self, value):
        self._listing_type = value
    def fdel(self):
        del self._listing_type
    return locals()
listing_type = property(**listing_type())

PS我还是不喜欢type: - )

答案 1 :(得分:1)

我不是Django专家,但我很确定你不能查询数据库中不是列的模型属性,这就是你要做的。也许尝试使用@property来修饰方法,使其像属性一样。

如果喜欢

,你可以做一个列表理解
results = [m for m in query_set if m.type = "Showing and listing"]