你如何看待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)
所以我这样做错了,还是不支持?
请看看这些型号:
class Album(models.Model):
user = models.ForeignKey(User)
name = models.CharField(max_length=200)
pub_date = models.DateTimeField(default=datetime.now)
class Photo(models.Model):
album = models.ForeignKey(Album, default=3)
image = models.ImageField(upload_to=get_upload_file_name)
caption = models.CharField(max_length=200)
pub_date = models.DateTimeField(default=datetime.now)
Run Code Online (Sandbox Code Playgroud)
如何获取特定相册的照片集??? 以及如何从照片实例本身获取相册?
我试过这个:
# To get the set of photos from the user (tika) album:
>>>t = User.objects.get(username='tika')
>>>t_album = Album.objects.get(user=t)
>>>t_album
<Album: tika_album>
>>>t_album.image_set.all()
AttributeError: 'Album' Object has no attribute 'image_set'
Run Code Online (Sandbox Code Playgroud)
请指导我正确的方向.谢谢.
我正在使用Django 1.6.5并且有MySQL的通用查询日志,所以我可以看到sql命中MySQL.
我注意到在Django的QuerySet中指定一个更大的限制是行不通的:
>>> from blog.models import Author
>>> len(Author.objects.filter(pk__gt=0)[0:999])
>>> len(Author.objects.all()[0:999])
Run Code Online (Sandbox Code Playgroud)
MySQL的一般日志显示两个查询都有LIMIT 21.
但是小于21的限制可以起作用,例如len(Author.objects.all()[0:10])可以生成一个sql LIMIT 10.
这是为什么?我需要配置什么吗?
使用这些Django ORM模型:
class A(Model):
pass
class B(A):
pass
Run Code Online (Sandbox Code Playgroud)
B结果模式中的表包含以下字段:
"a_ptr_id" integer PRIMARY KEY
Run Code Online (Sandbox Code Playgroud)
只是为了更好地理解Django的设计选择 - 有没有任何理由文档提到"ptr"表示什么?
我唯一的猜测是它是"指针"的缩写,但这似乎相当愚蠢,因为基本上任何具有外键约束的字段在概念上都类似于指针.
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查询级别应用这些条件的东西,以避免"读 - 修改 - 写"问题.
尝试检索包含满足某些条件的条目的博客(请参阅下面的模型说明):
Blog.objects.filter(entries__title__contains='entry')
Run Code Online (Sandbox Code Playgroud)
结果是:
[<Blog: blog1>, <Blog: blog1>]
Run Code Online (Sandbox Code Playgroud)
由于为了过滤相关模型上的对象而执行了JOIN,因此检索了相同的博客对象两次.仅过滤唯一对象的正确语法是什么?
数据模型:
class Blog(models.Model):
name = models.CharField(max_length=100)
def __unicode__(self):
return self.name
class Entry(models.Model):
title = models.CharField(max_length=100)
blog = models.ForeignKey(Blog, related_name='entries')
def __unicode__(self):
return self.title
Run Code Online (Sandbox Code Playgroud)
样本数据:
b1 = Blog.objects.create(name='blog1')
e1 = Entry.objects.create(title='entry 1', blog=b1)
e1 = Entry.objects.create(title='entry 2', blog=b1)
Run Code Online (Sandbox Code Playgroud) 我目前正在将QuerySet的结果放入我的js前端使用的JSON字符串中.
目前使用.values()和simplejson很容易:
simplejson.dumps(list(Task.objects.filter(list=mylist).values()))
Run Code Online (Sandbox Code Playgroud)
我现在在我的Task对象中添加了一个ManyToMany字段,希望将它包含在我的输出中,而不必为ManyToMany关系的每个值重复每个Task对象.
如果我只是做了Task.objects.filter(list=mylist).values('myManyToManyField', 'someOtherField') 输出将为每个值有一个单独的对象/行myManyToManyField
[{'myManyToManyField': 1, 'someOtherField': 'valueOne'},
{'myManyToManyField': 2, 'someOtherField': 'valueOne'},
{'myManyToManyField': 1, 'someOtherField': 'valueTwo'}]
Run Code Online (Sandbox Code Playgroud)
有没有办法得到这个结果?:
[{'myManyToManyField': [1,2], 'someOtherField': 'valueOne'},
{'myManyToManyField': 1, 'someOtherField': 'valueTwo'}]
Run Code Online (Sandbox Code Playgroud)
我现在唯一的解决方案是遍历所有Task对象并手动构建输出,根据需要将ManyToMany值放在其中.有一个更好的方法吗?如果不是 - 这会非常低效吗?
想象一下,我有一个python字典,其中键是现有用户ID,值是要添加到这些用户现有分数的分数.
例如:( {1: 1580, 4: 540, 2: 678}这可以拉伸到nk,v对)
我需要更新所有这些用户对象的分数(updated_score = original_score + new_score).一种方法是迭代,如下所示:
from django.db.models import F
scores = {1: 1580, 4: 540, 2: 678}
for user_id,score_to_add in scores.iteritems():
UserProfile.objects.filter(user_id=user_id).update(score=F('score')+score_to_add)
Run Code Online (Sandbox Code Playgroud)
但那是多个数据库调用.我可以一次通话吗?一个说明性的例子会很棒.正如您所猜测的那样,这是一个Django项目.