我很难创建数据迁移.我为我的应用程序使用两个数据库.我在settings.py中配置了数据库,并在Django docs中创建了一个路由器.
# settings.py
DB_HOST = 'localhost'
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'helios',
'HOST': DB_HOST,
'OPTIONS': {
'read_default_file': join(dirname(__file__), 'default.cnf'),
},
},
'other': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'gala_pol',
'HOST': DB_HOST,
'OPTIONS': {
'read_default_file': join(dirname(__file__), 'other.cnf'),
},
},
DATABASE_APPS_MAPPING = {
'contenttypes': 'default',
'auth': 'default',
'admin': 'default',
'sessions': 'default',
'messages': 'default',
'staticfiles': 'default',
'woodsmen': 'default',
'helios': 'default',
'hush': 'default',
'hunt': 'other',
'meat': 'other',
'beast': 'other',
}
# routers.py
class DatabaseAppsRouter(object):
def db_for_read(self, model, **hints):
if model._meta.app_label in …Run Code Online (Sandbox Code Playgroud) 所以有一次在我的第一次迁移之后进行了几次迁移,我决定将这些字段包括在内:
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
Run Code Online (Sandbox Code Playgroud)
进入我的一个模特.我makemigrations给它的时候
You are trying to add a non-nullable field 'created' to episode without a default; we can't do that (the database needs
something to populate existing rows).
所以我把它改成了
created = models.DateTimeField(auto_now_add=True, default=datetime.now)
Run Code Online (Sandbox Code Playgroud)
在makemigrations再次尝试之后,它说at_api.Episode.modified: (fields.E160) The options auto_now, auto_now_add, and default are mutually exclusive. Only one
of these options may be present.
好的,所以我继续前进并删除了auto_now_add
created = models.DateTimeField(default=datetime.now)
Run Code Online (Sandbox Code Playgroud)
我现在可以makemigrations没有任何问题.然后我删除default=datetime.now并替换它auto_now_add=True,并再次迁移没有任何问题.但是,我不禁觉得这可能不是最好的做事方式.我觉得项目后期可能出现问题.
在Django嵌套事务中 - "with transaction.atomic()"问题是,鉴于此......
def functionA():
with transaction.atomic():
#save something
functionB()
def functionB():
with transaction.atomic():
#save another thing
Run Code Online (Sandbox Code Playgroud)
如果functionB失败并回滚,functionA也会回滚吗?
凯文克里斯托弗亨利回答说:"是的,如果在任何一个功能中发生异常,它们都将被回滚." 然后他引用了文档,其中说明:
原子块可以嵌套.在这种情况下,当内部块成功完成时,如果稍后在外部块中引发异常,则仍可以回滚其效果.
此文档引用似乎没有解决原始问题.文档说当INNER BLOCK(是functionB)成功完成时,如果OUTER块(函数A)引发异常,它的效果仍然可以回滚.但问题是相反的情况.问题是,如果INNER块(functionB)FAILS是OUTER块(functionA)回滚?该文档引用未涉及该场景.
但是,在doc中我们看到这个例子......
from django.db import IntegrityError, transaction
@transaction.atomic
def viewfunc(request):
create_parent()
try:
with transaction.atomic():
generate_relationships()
except IntegrityError:
handle_exception()
add_children()
Run Code Online (Sandbox Code Playgroud)
......接着是这篇评论......
在此示例中,即使
generate_relationships()通过破坏完整性约束导致数据库错误,您也可以执行查询add_children(),并且create_parent()仍然存在更改.
如果我在看文档正确它说调用generate_relationships()(这类似于调用functionB在原来的问题)可能会失败,并在所做的更改create_parent(),并add_children()会被提交到数据库.这似乎与Kevin Christopher Henry的回答相矛盾.
让我感到困惑的是,我在Django嵌套的Transaction.atomic中看到了相同的问题/答案.
我是Django和stackoverflow的新手,所以我对我阅读文档没有太多信心,但它似乎与这两种反应都相矛盾.我正在寻找更有经验的人的澄清.非常感谢.
我常用的工具是在Linux系统上使用g ++的Emacs来实现我的研究算法.在过去的几年里,我以相当基本的方式使用了emacs.我打开C或C++文件,使用我选择的语法高亮方案编辑它们,然后从emacs(或者可能来自终端)编译和执行其他操作,包括在emacs中使用gdb进行调试.我知道etags和ctags,并且玩过etags和emacs,但似乎没有找到工具的"甜蜜点".
我想知道,其他人如何配置emacs以便它与etags和其他工具很好地融合?需要做些什么调整才能使emacs成为更好的IDE?
我遇到类似这样的情况(实际代码绑定在模板中,为简洁起见省略).
threads = Thread.objects.all()
for thread in threads:
print(thread.comments.count())
print(thread.upvotes.count())
Run Code Online (Sandbox Code Playgroud)
我已经设法使用Django的真棒prefetch_related方法大大减少了查询总数.
threads = Thread.objects.prefetch_related('comments').prefetch_related('upvotes')
Run Code Online (Sandbox Code Playgroud)
但是我想知道这种情况是否可以进一步优化.据我所知,prefetch_related检索与相关模型相关的所有数据.看起来我只关心相关模型的数量,而不关心模型本身,似乎这个查询可以进一步优化,以便它不会检索一堆不必要的数据.有没有办法在Django中执行此操作而不降低到原始SQL?
我想使用etags索引clojure文件,以便我可以使用Emacs的标记功能.但是etags不承认clojure功能.是否可以扩展etags以包含clojure定义?
所以我是Django的新手,想要描述一下这个场景:有一堆Persons,有一堆Items,一个人传给Items另一个人Person.
我有以下型号:
class Item(models.Model):
title = models.CharField(max_length=1024, blank=False)
def __unicode__(self):
return self.title
class Person(models.Model):
name = models.CharField(max_length=127, blank=False)
out_item = models.ManyToManyField(
Item,
through='Event',
through_fields=('from_user', 'item'),
related_name='giver'
)
in_item = models.ManyToManyField(
Item,
through='Event',
through_fields=('to_user', 'item'),
related_name='receiver'
)
def __unicode__(self):
return self.name
class Event(models.Model):
item = models.ForeignKey(Item)
from_user = models.ForeignKey(Person, related_name='event_as_giver')
to_user = models.ForeignKey(Person, related_name='event_as_receiver')
Run Code Online (Sandbox Code Playgroud)
但makemigrations告诉我app.Person: (models.E003) The model has two many-to-many relations through the intermediate model 'app.Event'.
我不知道我做错了什么?或者实现这种情况的干净方法是什么?也许我可以分开Event进去 …
在新版本的Django的文档中,文本中的内容与显示的代码之间存在歧义.
在描述多数据库配置的部分中,它介绍了路由器配置,并且有一个方法:
allow_relation(obj1, obj2, **hints)如果应该允许obj1和obj2之间的关系,则返回True;如果应该阻止关系,则返回False;如果路由器没有意见,则返回None.这纯粹是一种验证操作,由外键和多对多操作用于确定两个对象之间是否应该允许关系.
在文档的最后有这样的:
Django目前不提供跨越多个数据库的外键或多对多关系的任何支持.如果已使用路由器将模型分区到不同的数据库,则由这些模型定义的任何外键和多对多关系必须位于单个数据库的内部.
这是因为参照完整性.为了维护两个对象之间的关系,Django需要知道相关对象的主键是有效的.如果主键存储在单独的数据库中,则无法轻松评估主键的有效性.
但作为示例给出的路由器代码如下:
def allow_relation(self, obj1, obj2, **hints):
"""
Relations between objects are allowed if both objects are
in the primary/replica pool.
"""
db_list = ('primary', 'replica1', 'replica2')
if obj1._state.db in db_list and obj2._state.db in db_list:
return True
return None
Run Code Online (Sandbox Code Playgroud)
因此,即使对象来自不同的数据库,软件也允许这种关系.
有谁知道这意味着什么?
谢谢.
我一直在阅读有关 Etag 的内容,并且我知道有两种生成 Etag 的方法,弱的和强的。弱 Etag 在计算上比强 Etag 更容易生成。我还了解到,弱 Etag 对于大多数用例来说实际上已经足够了。
来自MDN
弱验证器很容易生成,但对于比较来说用处不大。强大的验证器非常适合比较,但很难有效生成。
另一个片段:
相同资源的两种表示形式的弱 Etag 值可能在语义上等效,但逐字节不同。
我发现很难理解资源在语义上相似但不是逐字节相同意味着什么?很高兴看到一些例子。
编辑:在这里找到了一个例子,但我不明白:
弱验证:两种资源表示在语义上是等效的,例如,从业务逻辑的角度来看,某些内容差异并不重要,例如,页面上显示的当前日期对于更新整个资源来说可能并不重要。
是否就像在生成 Etag 时,您可以决定内容的更改对于功能来说并不重要(例如,字体大小的 css 属性更改)并以 304 响应?如果是,那么浏览器上的资源什么时候更新,我猜只要Etag相同,浏览器就不会获取最新版本。在这种情况下,这可能意味着当发生重大更改并创建新的 Etag 时,CSS 属性更改只会与主要更改一起发送到浏览器。
我更新了django-dynamic-model存储库以支持Django 1.9.我收到了这个错误:
CommandError:
Conflicting migrations detected; multiple leaf nodes in the migration
graph: (0001_initial, 0002_auto__add_field_dynamicschemafield_extra in
dynamicmodel).
To fix them run 'python manage.py makemigrations --merge'
Run Code Online (Sandbox Code Playgroud)
运行后python manage.py makemigrations --merge,我又出现了一个错误:
File "/local/lib/python2.7/sitepackages/django/core/management/__init__.py",
line 353, in execute_from_command_line
utility.execute()
File "/local/lib/python2.7/sitepackages/django/core/management/__init__.py", line 345, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File
"/local/lib/python2.7/site-packages/django/core/management/base.py", line 348, in run_from_argv
self.execute(*args, **cmd_options)
File
"/local/lib/python2.7/site-packages/django/core/management/base.py", line 399, in execute
output = self.handle(*args, **options)
File
"/local/lib/python2.7/site-packages/django/core/management/commands/makemigrations.py", line 97, in handle
return self.handle_merge(loader, conflicts)
File
"/local/lib/python2.7/site-packages/django/core/management/commands/makemigrations.py", line 216, in handle_merge …Run Code Online (Sandbox Code Playgroud)