标签: django-orm

Django N + 1查询解决方案

在与同行讨论N + 1以及糟糕的数据库查询的严重性能影响后,我访问了http://guides.rubyonrails.org/active_record_querying.html.

ActiveRecord(Rails):

clients = Client.includes(:address).limit(10)
Run Code Online (Sandbox Code Playgroud)

在客户端具有地址的情况下,我打算在循环访问客户端时访问它们,Rails提供includes让它知道继续并将它们添加到查询中,这样可以立即消除9个查询.

Django的:

https://github.com/lilspikey/django-batch-select提供批量查询支持.你知道其他库或技巧来实现上面提供的Rails,但是在一个不那么冗长的庄园中(如在rails示例中只有19个字符修复N + 1并且非常清楚)?另外,批量选择是以同样的方式解决问题,还是这两个不同的事情?

顺便说一句,我不是在问select_related,虽然乍一看似乎是答案.我说的是address有一个forign键的情况client.

django django-orm select-n-plus-1

13
推荐指数
2
解决办法
3944
查看次数

Django过滤多对多中间表中的多个字段

我的django项目中有以下模型:

class Video(models.Model):
    media = models.ForeignKey(Media)

class Media(models.Model):
    title = models.CharField(max_length=255)
    formats = models.ManyToManyField(Format,through='MediaFormat',related_name='media',blank=True)

class Format(models.Model):
    title = models.CharField(max_length=50)

class MediaFormat(models.Model):
    status = models.IntegerField()
    format = models.ForeignKey(Format)
    media = models.ForeignKey(Media)
Run Code Online (Sandbox Code Playgroud)

现在,我想过滤所有具有特定格式的视频,并且该格式的状态代码为10(可以使用).我怎样才能做到这一点?(假设f是格式):

f = Format.objects.get(pk=3)
Run Code Online (Sandbox Code Playgroud)

我很想用:

Video.objects.filter(media__formats=f, media__mediaformat__status=10)
Run Code Online (Sandbox Code Playgroud)

但是,这将返回所有符合这两个假设的视频:

  • a)包含该特定格式,以及
  • b)包含状态为10的任何格式

我该如何过滤只有状态代码为10的那种特定格式的人?

谢谢!

django many-to-many django-orm

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

在Django ORM中透视数据和复杂注释

Django中的ORM让我们可以根据相关数据轻松地对查询集进行注释(添加字段),但是我找不到为不同过滤的相关数据子集获取多个注释的方法.

这是与django-helpdesk有关的问题,django-helpdesk是一个开源的Django驱动的故障单跟踪器.为了图表和报告的目的,我需要像这样转动数据

考虑这些模型:

CHOICE_LIST = (
    ('open', 'Open'),
    ('closed', 'Closed'),
)

class Queue(models.model):
    name = models.CharField(max_length=40)

class Issue(models.Model):
    subject = models.CharField(max_length=40)
    queue = models.ForeignKey(Queue)
    status = models.CharField(max_length=10, choices=CHOICE_LIST)
Run Code Online (Sandbox Code Playgroud)

而这个数据集:

队列:

ID | Name
---+------------------------------
1  | Product Information Requests
2  | Service Requests
Run Code Online (Sandbox Code Playgroud)

问题:

ID | Queue | Status
---+-------+---------
1  | 1     | open
2  | 1     | open
3  | 1     | closed
4  | 2     | open
5  | 2     | closed
6 …
Run Code Online (Sandbox Code Playgroud)

python sql django django-orm

13
推荐指数
1
解决办法
6129
查看次数

Django ORM - 模拟值().filter()链

我试图在Djangos model.Manager()类上模拟一个链式调用.现在我想嘲笑values()filter()方法.

为了测试我创建了一个小测试项目:

  1. 创建一个虚拟环境
  2. pip install django mock mock-django nose django-nose
  3. 创建一个项目 django-admin.py startproject mocktest
  4. 创建一个应用程序 manage.py startapp mockme
  5. 添加django_nosemocktest.mockmeINSTALLED_APPS(settings.py)
  6. 添加TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'到settings.py

为了确保所有设置都正确,我跑了manage.py test.运行一个测试,Django在您创建应用程序时创建的标准测试.

我做的下一件事是创建一个非常简单的模型.

mockme/models.py

from django.db import models

class MyModel(models.Model):
    name = models.CharField(max_length=50)
Run Code Online (Sandbox Code Playgroud)

我做的下一件事是创建一个使用的简单函数MyModel.这是我想要稍后测试的功能.

mockme/functions.py

from models import MyModel

def chained_query():
    return MyModel.objects.values('name').filter(name='Frank')
Run Code Online (Sandbox Code Playgroud)

这里没有什么特别的事情发生.该函数正在过滤MyModel对象以查找其中的所有实例name='Frank'.对values()的调用将返回一个ValuesQuerySet只包含所有找到的MyModel实例的name字段的内容.

mockme/tests.py

import mock

from django.test import TestCase
from mocktest.mockme.models import MyModel …
Run Code Online (Sandbox Code Playgroud)

python django django-orm python-mock django-nose

13
推荐指数
2
解决办法
5394
查看次数

使用Django 1.7创建部分索引

Django 1.7提及类的文档RunSQL可用于在表上创建部分索引.我有一个表,我想的组合title,blogcategory是唯一的.但是,如果未提供类别,则标题和博客的组合仍应是唯一的.

class Post(models.Model):
    title = models.CharField(max_length=200)
    blog = models.ForeignKey(Blog)
    category = models.ForeignKey(Category, null=True, blank=True)
Run Code Online (Sandbox Code Playgroud)

我可以使用部分索引实现此约束(如下面显示的SQL).如果我使用Django 1.7迁移,我在哪里添加此代码?

CREATE UNIQUE INDEX idx1 
  ON Post (title, blog_id, category_id) 
  WHERE category_id IS NOT NULL;

CREATE UNIQUE INDEX idx2 
  ON Post (title, blog_id)
  WHERE category_id IS NULL;
Run Code Online (Sandbox Code Playgroud)

django django-models django-orm django-1.7 django-migrations

13
推荐指数
1
解决办法
3126
查看次数

Django 1.11中的数据库索引:db_true,索引和index_together之间的差异

Django 1.11提供了创建数据库索引的新方法.到目前为止,我们db_index=True在每个领域都有:

# example 1

class Person(models.Model):
    name = models.CharField(db_index=True)
    age = models.IntegerField(db_index=True)
Run Code Online (Sandbox Code Playgroud)

现在我们已经models.Index和可能indexesclass Meta块内声明- 甚至是index_together.

那说我有两个疑问:

1.示例1中的代码是否与下面的示例2完全相同?

# example 2

class Person(models.Model):
    name = models.CharField()
    age = models.IntegerField()

    class Meta:
        indexes = [
            models.Index(fields=['name']),
            models.Index(fields=['age'])
        ]
Run Code Online (Sandbox Code Playgroud)

2. index多个字段怎么样index_together?下面的例子3和4做了完全相同的事情?

# example 3

class Person(models.Model):
    name = models.CharField()
    age = models.IntegerField()

    class Meta:
        indexes = [
            models.Index(fields=['name', 'age'])
        ]
Run Code Online (Sandbox Code Playgroud)
# example 4

class Person(models.Model):
    name = models.CharField()
    age …
Run Code Online (Sandbox Code Playgroud)

python django django-orm django-1.11

13
推荐指数
1
解决办法
2153
查看次数

查看Django queryset delete的SQL查询

你如何看待Django生成的SQL DELETE

SELECT查询集上执行操作时,您可以执行以下操作:

>>> qs = Entry.objects.filter(date__gt='2010-06-01')
>>> qs.query.as_sql()
('SELECT ...)
Run Code Online (Sandbox Code Playgroud)

但我不知道如何获取SQL,以便在我这样做时发生qs.delete().

它看起来更复杂,因为Django 在删除对象时" 模拟SQL约束ON DELETE CASCADE的行为 ".

(背景:在删除子类模型对象时,尝试调试由外键约束生成的IntegrityError.)

django django-orm

12
推荐指数
1
解决办法
2356
查看次数

如何在反向外键上选择相关?

可能重复:
Django中的左外部反向select_related?

A BlogPost有很多个Comment.我想得到一份BlogPosts及其所有评论的清单.

因此,我有

BlogPost.objects.filter(my_filter).select_related()
Run Code Online (Sandbox Code Playgroud)

但是ForeignKey是在Comment,而不是BlogPost,所以select_related()不会预取任何评论.有没有办法让这个工作?

我不能反向查询(Comment.objects...),因为随后的其他对象select_related() 获取是行不通的.我需要双向工作.

django django-models django-orm

12
推荐指数
1
解决办法
5369
查看次数

Django Admin内联递归ManyToMany

我有以下模型与自身的多对多关系

class Ticket(models.Model):

    STATUS = (
        (0, "Open"),
        (1, "Closed"),
    )
    status = models.SmallIntegerField(default=0,choices=STATUS)
    title = models.CharField(max_length=100)
    replies = models.ManyToManyField('self')
    description = models.TextField()
Run Code Online (Sandbox Code Playgroud)

我试图使用以下代码将此模型显示为管理员中的内联

class TicketReply(admin.TabularInline):
    model = Ticket.replies.through
Run Code Online (Sandbox Code Playgroud)

但是我一直收到这个错误

<class 'tsn.ticket.models.Ticket_replies'> has more than 1 ForeignKey to <class 'tsn.ticket.models.Ticket'>
Run Code Online (Sandbox Code Playgroud)

所以我这样做错了,还是不支持?

python django django-orm django-admin

12
推荐指数
1
解决办法
2163
查看次数

Django有条件的创造

Django ORM是否提供了有条件地创建对象的方法?

例如,假设您希望使用某种乐观并发控制来插入新对象.
在某个时刻,您知道要在该表中插入的最新对象,并且您只想在此后没有插入新对象时才创建新对象.

如果是更新,您可以根据修订号进行过滤:

updated = Account.objects.filter(
    id=self.id,
    version=self.version,
).update(
    balance=balance + amount,
    version=self.version + 1,
)
Run Code Online (Sandbox Code Playgroud)

但是,我找不到任何记录的方式来为a create()save()call 提供条件.

我正在寻找在SQL查询级别应用这些条件的东西,以避免"读 - 修改 - 写"问题.

python django django-orm

12
推荐指数
1
解决办法
791
查看次数