说我有一个简单的论坛模型:
class User(models.Model):
username = models.CharField(max_length=25)
...
class Topic(models.Model):
user = models.ForeignKey(User)
...
class Post(models.Model):
user = models.ForeignKey(User)
...
Run Code Online (Sandbox Code Playgroud)
现在说我想查看用户子集的每个用户有多少主题和帖子(例如,他们的用户名以"ab"开头).
所以,如果我为每个帖子和主题做一个查询:
User.objects.filter(username_startswith="ab")
.annotate(posts=Count('post'))
.values_list("username","posts")
Run Code Online (Sandbox Code Playgroud)
Yeilds:
[('abe', 5),('abby', 12),...]
Run Code Online (Sandbox Code Playgroud)
和
User.objects.filter(username_startswith="ab")
.annotate(topics=Count('topic'))
.values_list("username","topics")
Run Code Online (Sandbox Code Playgroud)
产量:
[('abe', 2),('abby', 6),...]
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试注释两个以获得一个列表时,我得到一些奇怪的东西:
User.objects.filter(username_startswith="ab")
.annotate(posts=Count('post'))
.annotate(topics=Count('topic'))
.values_list("username","posts", "topics")
Run Code Online (Sandbox Code Playgroud)
产量:
[('abe', 10, 10),('abby', 72, 72),...]
Run Code Online (Sandbox Code Playgroud)
为什么主题和帖子成倍增加?我期待这个:
[('abe', 5, 2),('abby', 12, 6),...]
Run Code Online (Sandbox Code Playgroud)
获得正确列表的最佳方法是什么?
当我这样做
>>> b = Blog.objects.all()
>>> b
Run Code Online (Sandbox Code Playgroud)
我明白了
>>>[<Blog: Blog Title>,<Blog: Blog Tile>]
Run Code Online (Sandbox Code Playgroud)
当我查询b是什么类型时,
>>> type(b)
Run Code Online (Sandbox Code Playgroud)
我明白了
>>> <class 'django.db.models.query.QuerySet'>
Run Code Online (Sandbox Code Playgroud)
这是什么意思?它是像dict,list等数据类型吗?
我将如何构建像QuerySet这样的数据结构的示例.
我想知道django如何构建QuerySet(血腥细节)
迦特.
我正在尝试OR在Django filter()函数中使用运算符.现在我有
contactlist = Contact.objects.filter(last_name__icontains=request.POST['query'])
Run Code Online (Sandbox Code Playgroud)
但我也想用名字搜索.例如:
contactlist = Contact.objects.filter(last_name__icontains=request.POST['query'] OR first_name__icontains=request.POST['query'])
Run Code Online (Sandbox Code Playgroud)
有谁知道如何做到这一点?
我有一个QuerySet,让我们调用它qs,它由一些与此问题无关的属性排序.然后我有一个对象,让我们称之为obj.现在,我想知道在什么指数obj在qs作为有效越好.我知道我可以使用.index()Python或者可能循环qs比较每个对象obj,但是这样做的最佳方法是什么?我正在寻找高性能,这是我唯一的标准.
在Windows上使用Python 2.6.2和Django 1.0.2.
我经常看到像这样的结构
MyModel.objects.all().filter(...)
Run Code Online (Sandbox Code Playgroud)
这将返回默认Mananger的QuerySet.起初all()似乎是多余的,因为
MyMode.objects.filter(...)
Run Code Online (Sandbox Code Playgroud)
提供相同的结果.
但是,这对于默认的Manager似乎是安全的,因为Django文档中有以下两个语句:
摘自"添加额外管理器方法"一章
自定义Manager方法可以返回您想要的任何内容.它不必返回QuerySet.
all()经理方法的定义:
all()返回当前QuerySet(或QuerySet子类)的副本.这在您可能希望传入模型管理器或QuerySet并对结果进行进一步过滤的情况下非常有用.在任一对象上调用all()之后,你肯定会有一个QuerySet来使用.
这似乎有点像我的矛盾.一方面,Django提供了让管理器方法返回任何首选对象类型的自由,另一方面它需要一个QuerySet用于该all()方法.我知道每个经理都有一个get_queryset被调用的方法all().但谁阻止我压倒all()我的自定义经理?虽然我同意这样做是不好的设计.
所以据我所知,该all()方法不保证返回QuerySet.到底是什么MyModel.objects回报?这句话是否要求all()?还是`get_queryset()?
你喜欢MyModel.objects.filter(...)还是MyModel.objects.all().filter(...).如果是这样,为什么?
您是否曾遇到过那些会以不合需要的方式搞乱这些方法的经理?
我有一个MyModel带有布尔字段的模型active
在其他地方,我正在检索一个查询集:
qs = MyModel.Objects.filter(....)
Run Code Online (Sandbox Code Playgroud)
如何active=False为此中的所有对象设置qs?
有时我需要确保某些情况下是从查询集排除.
这是我通常这样做的方式:
unwanted_instance = MyModel.objects.get(pk=bad_luck_number)
uninteresting_stuff_happens()
my_results = MyModel.objects.exclude(id=unwanted_instance.id)
Run Code Online (Sandbox Code Playgroud)
或者,如果我有更多的:
my_results = MyModel.objects.exclude(id_in=[uw_in1.id, uw_in2.id, uw_in3.id])
Run Code Online (Sandbox Code Playgroud)
这'感觉'有点笨重,所以我试过:
my_ideally_obtained_results = MyModel.objects.exclude(unwanted_instance)
Run Code Online (Sandbox Code Playgroud)
哪个不起作用.不过,我看到这里的SO是一个可以使用子查询作为参数排除.
我运气不好吗?我缺少一些功能(检查文档,但没有发现任何有用的指针)
我想通过使用带注释的值更新queryset中的所有行.
我有一个简单的模型:
class Relation(models.Model):
rating = models.IntegerField(default=0)
class SignRelation(models.Model):
relation = models.ForeignKey(Relation, related_name='sign_relations')
rating = models.IntegerField(default=0)
Run Code Online (Sandbox Code Playgroud)
我想要解释这段代码:
for relation in Relation.objects.annotate(total_rating=Sum('sign_relations__rating')):
relation.rating = relation.total_rating or 0
relation.save()
Run Code Online (Sandbox Code Playgroud)
并使用以下内容更新一个SQL请求:
Relation.objects.update(rating=Sum('sign_relations__rating'))
Run Code Online (Sandbox Code Playgroud)
不起作用:
TypeError: int() argument must be a string or a number, not 'Sum'
Run Code Online (Sandbox Code Playgroud)
要么
Relation.objects.annotate(total_rating=Sum('sign_relations__rating')).update(rating=F('total_rating'))
Run Code Online (Sandbox Code Playgroud)
也不起作用:
DatabaseError: missing FROM-clause entry for table "relations_signrelation"
LINE 1: UPDATE "relations_relation" SET "rating" = SUM("relations_si...
Run Code Online (Sandbox Code Playgroud)
为此可以使用Django的ORM吗?没有关于在文档中一起使用update()和annotate()的信息.
我对Django很新,对MVC,DB查询也没有太多经验.
我有一个Customer表,其中包括customer_name,city_name以及state_name(从外键表中提取).在HTML中,我试图在列表中显示结果,首先按state_name按字母顺序排序,然后按city_name排序,再按customer_name name排序.像这样......
ARIZONA
PHOENIX
AAA, Inc.
BBB, LLC.
SCOTTSDALE
AAA, LLC.
DDD, Corp.
CALIFORNIA
ANAHEIM
...
Run Code Online (Sandbox Code Playgroud)
我的model.py如下:
from django.db import models
class Customer(models.Model):
def __unicode__(self):
return self.customer_name
customer_name = models.CharField(max_length=60)
city_name = models.CharField(max_length=30)
state = models.ForeignKey('State')
class State(models.Model):
def __unicode__(self):
return self.state_name
state_name = models.CharField(max_length=20)
state_code = models.CharField(max_length=2)
Run Code Online (Sandbox Code Playgroud)
在我的urls.py中,我有:
url("^customers/$",
direct_to_template,
{'template': 'pages_fixed/customers.html',
'extra_context': {'customers': Customer.objects.all().order_by('state')}},
name='customers'),
Run Code Online (Sandbox Code Playgroud)
在我的HTML中,我有一个工作模板:
<div class='customers'>
{% for customer in customers %}
<div class='block_customer'>
<p>{{ customer.state.state_name }}</p>
<p>{{ customer.city_name }}</p>
<p>{{ customer.customer_name }}</p>
</div>
{% …Run Code Online (Sandbox Code Playgroud) 我有一个名称列表,我想匹配不区分大小写,有没有办法在不使用下面的循环的情况下执行此操作?
a = ['name1', 'name2', 'name3']
result = any([Name.objects.filter(name__iexact=name) for name in a])
Run Code Online (Sandbox Code Playgroud) django ×10
django-queryset ×10
python ×4
annotations ×1
count ×1
django-orm ×1
filtering ×1
indexing ×1
postgresql ×1
sorting ×1
sql-update ×1