标签: django-queryset

Django Count()在多个注释中

说我有一个简单的论坛模型:

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)

获得正确列表的最佳方法是什么?

django annotations count django-queryset

40
推荐指数
1
解决办法
2万
查看次数

什么是django QuerySet?

当我这样做

>>> 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(血腥细节)

迦特.

django django-queryset

39
推荐指数
3
解决办法
3万
查看次数

Django模型查询中的OR运算符

我正在尝试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)

有谁知道如何做到这一点?

django django-models django-queryset

38
推荐指数
2
解决办法
3万
查看次数

获取查询集中元素的索引

我有一个QuerySet,让我们调用它qs,它由一些与此问题无关的属性排序.然后我有一个对象,让我们称之为obj.现在,我想知道在什么指数objqs作为有效越好.我知道我可以使用.index()Python或者可能循环qs比较每个对象obj,但是这样做的最佳方法是什么?我正在寻找高性能,这是我唯一的标准.

在Windows上使用Python 2.6.2和Django 1.0.2.

python django indexing django-queryset

37
推荐指数
6
解决办法
3万
查看次数

Django ORM - objects.filter()与objects.all().filter() - 首选哪一个?

我经常看到像这样的结构

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(...).如果是这样,为什么?

  • 您是否曾遇到过那些会以不合需要的方式搞乱这些方法的经理?

python django django-orm django-queryset django-managers

37
推荐指数
2
解决办法
4万
查看次数

Django:更改查询集中所有对象的字段值

我有一个MyModel带有布尔字段的模型active

在其他地方,我正在检索一个查询集:

qs = MyModel.Objects.filter(....) 
Run Code Online (Sandbox Code Playgroud)

如何active=False为此中的所有对象设置qs

python django django-queryset

36
推荐指数
2
解决办法
2万
查看次数

Django从查询集中排除特定实例而不使用字段查找

有时我需要确保某些情况下是从查询集排除.
这是我通常这样做的方式:

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是一个可以使用子查询作为参数排除.
我运气不好吗?我缺少一些功能(检查文档,但没有发现任何有用的指针)

django filtering django-queryset

35
推荐指数
2
解决办法
3万
查看次数

Django使用注释更新queryset

我想通过使用带注释的值更新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 django-models django-queryset sql-update

35
推荐指数
3
解决办法
6692
查看次数

Django:如何编写查询以使用多列进行排序,通过模板显示

我对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)

python sorting django postgresql django-queryset

35
推荐指数
2
解决办法
4万
查看次数

Django查询不区分大小写的列表匹配

我有一个名称列表,我想匹配不区分大小写,有没有办法在不使用下面的循环的情况下执行此操作?

a = ['name1', 'name2', 'name3']
result = any([Name.objects.filter(name__iexact=name) for name in a])
Run Code Online (Sandbox Code Playgroud)

django django-queryset

34
推荐指数
5
解决办法
1万
查看次数