我在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')
但是,仍然无法将其传递给视图。
答案 0 :(得分:2)
type
是built-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"]