在与同行讨论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项目中有以下模型:
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)
但是,这将返回所有符合这两个假设的视频:
我该如何过滤只有状态代码为10的那种特定格式的人?
谢谢!
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) 我试图在Djangos model.Manager()类上模拟一个链式调用.现在我想嘲笑values()和filter()方法.
为了测试我创建了一个小测试项目:
pip install django mock mock-django nose django-nosedjango-admin.py startproject mocktestmanage.py startapp mockmedjango_nose和mocktest.mockme以INSTALLED_APPS(settings.py)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) Django 1.7提及类的文档RunSQL可用于在表上创建部分索引.我有一个表,我想的组合title,blog和category是唯一的.但是,如果未提供类别,则标题和博客的组合仍应是唯一的.
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
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和可能indexes在class 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) 你如何看待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.)
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() 并获取是行不通的.我需要双向工作.
我有以下模型与自身的多对多关系
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)
所以我这样做错了,还是不支持?
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查询级别应用这些条件的东西,以避免"读 - 修改 - 写"问题.
django ×10
django-orm ×10
python ×5
django-1.11 ×1
django-1.7 ×1
django-admin ×1
django-nose ×1
many-to-many ×1
python-mock ×1
sql ×1