【问题标题】:get all from table django not only __str__(self)从表 django 中获取所有内容,不仅是 __str__(self)
【发布时间】:2017-04-05 11:54:08
【问题描述】:

models.py

class club(models.Model):
    name = models.CharField(max_length=30)
    city = models.CharField(max_length=30)
    premiere_leauge = models.BooleanField(default=False)

    def __str__(self):
    return self.name

Views.py

...
a = request.POST['club']
b = request.POST['city']

result = club.objects.all.get(name__exact=a, city__exact=b)
....

一切都很好,但我相信结果会回报我:

def __str__(self):
    return self.name

不管怎样,我想要一个相当于 'SELECT * FROM APP_CLUB where name='something and city='something'; 的东西,这样我就可以在 django 中做进一步的操作,比如:

if result[3] is True:
       do_something()

【问题讨论】:

  • 使用filter 而不是get
  • 谢谢,但我想访问表中名为 Premiere leauge 的布尔字段?我怎样才能做到这一点?通过使用过滤器,结果 [1] 我得到第二个对象而不是列。
  • result[1].premiere_leauge 呢?

标签: python django django-models django-views django-queryset


【解决方案1】:

正如官方documentation所建议的:

club.objects.filter(name='something')

它将返回完全相同的:

'SELECT * FROM APP_CLUB where name='something';

例子:

clubs = club.objects.filter(name__exact='something')

for club in clubs:
    if club.premier_league:
        do_something()

如果你只想获得一个俱乐部,那么就这样做吧:

club = club.objects.get(name='something')
premier_league_value_of_club = club.premier_league

【讨论】:

  • 谢谢,但我想访问表中名为 Premiere leauge 的布尔字段?我怎样才能做到这一点?通过使用过滤器,结果 [1] 我得到第二个对象而不是列。
  • 添加回答
  • 非常感谢。我明白了
【解决方案2】:

使用filter 代替get

results = club.objects.filter(name__exact=a, city__exact=b)

然后您可以对其进行迭代以访问所有模型属性,如下所示

for result in results:
    print result.name, result.city, result.premier_league

另外,根据 PEP-8,你应该命名你的类名,理想情况下应该是标题大写 Club 而不是小写 club

【讨论】:

  • 谢谢,但我想访问表中名为 Premiere leauge 的布尔字段?我怎样才能做到这一点?通过使用过滤器,结果 [1] 我得到第二个对象而不是列。
  • 添加了访问属性的适当代码。
【解决方案3】:

你快到了,我想你在这里错过了filter 函数。你可以这样使用它:

a = request.POST['club']
b = request.POST['city']

result = club.objects.filter(name__exact=a, city__exact=b)

它将返回一个包含实际数据库条目的查询集。

__str__(self) 函数用于将查询集条目转换为字符串,无论是字符串转换还是打印。

那么关于这个:

if result[3] is True:
   do_something()

我不太明白你的意思,但如果 3 是数据库中条目的 id,那么你可以这样做:

if result.get(id=3).premiere_leauge:
    do_something()

但您可能需要先检查带有 id 的条目是否存在以避免错误:

if result.filter(id=3).exists() and result.get(id=3).premiere_leauge:
    do_something()

【讨论】:

  • 您应该使用 .get 作为 id。它要快得多。
  • 使用 try except 块而不是两次访问数据库进行存在性检查。
【解决方案4】:

你应该修改你的查询,如下所示

result = club.objects.filter(name__exact=a, city__exact=b)

祝你好运!!

【讨论】:

  • .all 不需要
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-13
  • 2020-11-30
相关资源
最近更新 更多