我在索引视图中有以下代码.
latest_entry_list = Entry.objects.filter(is_published=True).order_by('-date_published')[:10]
for entry in latest_entry_list:
entry.views = entry.views + 1
entry.save()
Run Code Online (Sandbox Code Playgroud)
如果初始查询返回了十行(限制),那么保存问题10是否会更新对数据库的更新调用,或者Django是否"足够聪明"以仅发出一次更新调用?
是否有更有效的方法来实现这一结果?
我需要在Form clean方法中验证上传的XML文件的内容,但是我无法打开该文件进行验证.它接缝,在clean方法中,文件尚未从内存(或临时目录)移动到目标目录.
例如,以下代码不起作用,因为该文件尚未移动到该目标.它仍然在内存(或临时目录)中:
xml_file = cleaned_data.get('xml_file')
xml_file_absolute = '%(1)s%(2)s' % {'1': settings.MEDIA_ROOT, '2': xml_file}
xml_size = str(os.path.getsize(xml_file_absolute))
Run Code Online (Sandbox Code Playgroud)
当我查看"cleaning_data"变量时,它会显示:
{'xml_file': <InMemoryUploadedFile: texting.nzb (application/octet-stream)>}
Run Code Online (Sandbox Code Playgroud)
cleaned_data.get('xml_file') 只返回"texting.nzb"作为字符串.
是否有另一种方法来访问内存(或临时目录)中的文件?
同样,这是我的Form的clean方法,它绑定到默认的管理视图.我一次又一次地被告知所有验证都应该在表单中处理,而不是视图.正确?
我想使用条目的主键保存我的文件.
这是我的代码:
def get_nzb_filename(instance, filename):
if not instance.pk:
instance.save() # Does not work.
name_slug = re.sub('[^a-zA-Z0-9]', '-', instance.name).strip('-').lower()
name_slug = re.sub('[-]+', '-', name_slug)
return u'files/%s_%s.nzb' % (instance.pk, name_slug)
class File(models.Model):
nzb = models.FileField(upload_to=get_nzb_filename)
name = models.CharField(max_length=256)
Run Code Online (Sandbox Code Playgroud)
我知道第一次保存对象时主键不可用,所以我愿意采取额外的命中来保存对象只是为了得到主键,然后继续.
上面的代码不起作用.它会引发以下错误:
maximum recursion depth exceeded while calling a Python object
Run Code Online (Sandbox Code Playgroud)
我假设这是一个无限循环.调用该save方法将调用该get_nzb_filename方法,该方法将再次调用该save方法,依此类推.
我正在使用最新版本的Django主干.
如何获取主键以便我可以使用它来保存上传的文件?
更新@muhuk:
我喜欢你的解决方案.你能帮我实现吗?我已将我的代码更新为以下内容,错误是'File' object has no attribute 'create'.也许我正在使用你在上下文中写的东西?
def create_with_pk(self):
instance = self.create()
instance.save()
return instance
def get_nzb_filename(instance, filename):
if not instance.pk:
create_with_pk(instance) …Run Code Online (Sandbox Code Playgroud) 我有一个小型VPS服务器,它有一个Nginx前端,提供静态媒体文件,并将Django请求传递回运行mod_wsgi的Apache 2.2 prefork MPM服务器.
有一个(非常)小网站加载和工作,它目前使用143MB的256MB RAM.
使用该top命令,我可以看到Apache使用了52.9%的可用RAM,其中memcache使用了2.1%.
考虑到我打算在这台服务器上安装相当多的Django项目,我想知道我是否可以做些什么来削减Apache使用的RAM量?
我正在尝试重命名文件,因为它已在模型的save方法中上传.我正在将文件重命名为文件主键和文件标题的组合.
我首先上传文件,上传新文件,文件或文件标题没有变化时都能正常工作.
但是,当文件的标题更改,并且系统尝试将旧文件重命名为新路径时,我收到以下错误:
WindowsError at /admin/main/file/1/
(32, 'The process cannot access the file because it is being used by another process')
Run Code Online (Sandbox Code Playgroud)
我真的不知道怎么解决这个问题.我试过把文件复制到新路径.这有效,但我不知道我可以删除旧版本.
缩短型号:
class File(models.Model):
nzb = models.FileField(upload_to='files/')
name = models.CharField(max_length=256)
name_slug = models.CharField(max_length=256, blank=True, null=True, editable=False)
def save(self):
# Create the name slug.
self.name_slug = re.sub('[^a-zA-Z0-9]', '-', self.name).strip('-').lower()
self.name_slug = re.sub('[-]+', '-', self.name_slug)
# Need the primary key for naming the file.
super(File, self).save()
# Create the system paths we need.
orignal_nzb = u'%(1)s%(2)s' % {'1': settings.MEDIA_ROOT, '2': self.nzb} …Run Code Online (Sandbox Code Playgroud) 基本上我需要每个条目评论的计数:
SELECT e.*, COUNT(c.id) as comments FROM blog_entry e LEFT JOIN blog_comment c ON e.id = c.entry_id GROUP BY e.id, e.name, e.name_slug, e.date_published, e.category, e.image, e.body, e.is_published, e.views, e.subscription_sent ORDER BY e.date_published DESC LIMIT 15;
Run Code Online (Sandbox Code Playgroud)
但我不知道如何使用Django来解决这个问题.
这是我到目前为止,它完美的工作,除了没有评论计数.有人能指出我正确的方向使用Django进行这样的连接吗?
from project.blog.models import Entry, Comment
def index(request):
latest_entry_list = Entry.objects.filter(is_published=True).order_by('-date_published')[:15]
return render_to_response('blog/index.html', {'latest_entry_list': latest_entry_list)
Run Code Online (Sandbox Code Playgroud) 我正在使用manage.py runserver命令提供文件在Windows XP上使用Django进行开发.Apache没有涉及.当我登录管理并尝试删除文件时,出现"SuspiciousOperation"错误.
这是追溯:http:
//dpaste.com/123112/
这是我的完整型号:http:
//dpaste.com/hold/123110/
如何摆脱这个"SuspiciousOperation"错误?
编辑:这是我的媒体设置:
MEDIA_ROOT = 'C:/Server/Projects/postnzb/static/'
MEDIA_URL = '/static/'
Run Code Online (Sandbox Code Playgroud) 以下查询执行我想要它做的事情,但是,我不知道它是否有效.我浏览了Django聚合文档,将它放在一起,查看了查询,并像混淆的狗一样向侧面倾斜.
查询实际执行的操作是获取已发布的条目"名称"和"name_slug",其中包含一个或多个已批准的注释,并按最新注释的"date_published"字段对结果进行排序.结果是最近活跃的Entry的列表.
所以几个问题.(1)你在查询中看到的只是一个普通的禁忌.(2)有没有办法可以看到查询数据库的RAW SQL?
楷模:
class Entry(models.Model):
name = models.CharField(max_length=200, unique=True)
name_slug = models.SlugField(max_length=200, blank=True, editable=False, unique=True)
date_published = models.DateTimeField()
is_published = models.BooleanField(default=False)
class Comment(models.Model):
entry = models.ForeignKey('Entry')
date_published = models.DateTimeField()
approved_choices = (('N', 'No'), ('Y', 'Yes'), ('M', 'Needs Moderation'),)
approved = models.CharField(max_length=1, choices=approved_choices, default='N')
Run Code Online (Sandbox Code Playgroud)
查询:
active_entry_list = Entry.objects
.values('name', 'name_slug')
.filter(is_published=True, comment__approved='Y')
.annotate(latest_comment=Max('comment__date_published'),comments=Count('comment'))
.filter(comments__gte=1)
.order_by('-latest_comment')
[:6]
Run Code Online (Sandbox Code Playgroud) django ×8
python ×5
database ×3
performance ×3
file-io ×2
apache ×1
deployment ×1
mod-wsgi ×1
postgresql ×1
sql ×1
windows ×1