试图弄清楚如何为Django管理命令编写一些mixins,它将包装而
BaseCommand.option_list不会丢失当前类或任何继承的类/ mixins的值.目标是避免BaseCommand.option_list + MyCommonOptionMixin.option_list + MyOtherCommonOptionMixin.option_list + ( local command options )在我的命令中做.
例:
class BaseCommmand(object):
option_list = (
# Default options here.
)
# Rest of BaseCommand code.
Run Code Online (Sandbox Code Playgroud)
我用一些常见的选项定义了一个mixin:
class MyCommonOptionMixin(object):
option_list = (
# Some common option/options I wish to have available in many commands
)
def __getattribute__(self, name):
values = super(MyCommonOptionMixin, self).__getattribute__(name)
if name == 'option_list':
for option in self.option_list:
if option not in values:
values += option,
return values
Run Code Online (Sandbox Code Playgroud)
也许我还有一个,只是为了涵盖我有多个的情况.mixin都覆盖了__getattribute__
class MyOtherCommonOptionMixin(object): …Run Code Online (Sandbox Code Playgroud) 哪个选项最好,1还是2?
1.
class TopicForm(forms.Form):
name = forms.CharField(required=True)
body = RichTextFormField(required=True)
def save(self, request):
t = models.Topic(user=request.user,
site=get_current_site(request),
name=self.cleaned_data['name'],
body=self.cleaned_data['body'])
t.slug = slugify(self.name)
t.body_html = seo.nofollow(seo.noindex(self.body))
t.ip = utils.get_client_ip(request)
t.save()
Run Code Online (Sandbox Code Playgroud)
或2.
class Topic(models.Model):
...
def save(self, *args, **kwargs):
self.slug = slugify(self.name)
self.body_html = seo.nofollow(seo.noindex(self.body))
self.ip = utils.get_client_ip(request)
super(Topic, self).save(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud) 我有两个型号.一个是Subscriber在节省时间我根据已经分配给该池的订户数量来分配池:
class Subscriber(models.Model):
pool = models.ForeignKey(Pool)
interface = models.CharField(max_length=30)
class Pool(models.Model):
name = models.CharField(max_length=50)
Run Code Online (Sandbox Code Playgroud)
假设只有4个Subscribers可以分配给一个池.这就是为什么我要覆盖Subscriber的save()方法:
def save(self, *args, **kwargs):
if not self.pk:
#Look for a free Pool among the available ones
for pool in Pool.objects.all():
if pool.subscriber_set.count() < 4:
self.pool = pool
print "Assigned pool: %s" % pool.name
super(Subscriber, self).save(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
它运行良好,直到我用完池(所有这些都分配了4个用户).我应该如何从Django管理员处理这个?理想情况下,我想向用户显示一些错误消息,以便他可以创建更多池.
我宁愿不将池分配代码移动到窗体的clean()方法,因为可能用户也将从不同的界面创建,而不是管理GUI.
有任何想法吗?
非常感谢!
我This is forbidden when an 'atomic' block is active.在Django 1.8安装上收到错误.
我已经尝试将它包装在两者transaction.atomic():中以及创建例外IntegrityError
这是我的代码:
item = Item.objects.filter(item_id = data['item_id'])[:1][0]
iserializer = ItemSerializer(item, data=data, partial=True)
try:
with transaction.atomic():
if iserializer and iserializer.is_valid():
iserializer.save()
except IntegrityError:
pass
Run Code Online (Sandbox Code Playgroud)
可能是什么原因造成的?为什么我的异常处理无法防止收到此错误?
这是追溯:
Traceback (most recent call last):
File "<console>", line 4, in <module>
File "/home/vagrant/client/venv/bin/local/lib/python2.7/site-packages/rest_framework/serializers.py", line 186, in save
self.instance = self.update(self.instance, validated_data)
File "/home/vagrant/client/venv/bin/local/lib/python2.7/site-packages/rest_framework/serializers.py", line 880, in update
instance.save()
File "/vagrant/client/client/items/models.py", line 45, in save
transaction.commit()
File "/home/vagrant/client/venv/bin/local/lib/python2.7/site-packages/django/db/transaction.py", line 42, in …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个可调用的默认字段,如下所示:
from datetime import date, timedelta
from django.db import models
class Preferences(models.Model):
expiration_days = models.IntegerField(default=30)
... other db settings here ...
class ImportantBusinessObject(models.Model):
expiration_date = models.DateField(default=get_default_expiration_date)
def get_default_expiration_date():
expiration_days = Preferences.objects.first().expiration_days
return date.today() + timedelta(days=expiration_days)
Run Code Online (Sandbox Code Playgroud)
这个想法是,数据库中存储了一组全局首选项,这些首选项会影响其他模型对象的默认值。
一切都很好,直到需要向Preferences类中添加另一个字段为止。然后,在构建数据库时(例如,在运行测试时),添加该expiration_date字段的迁移最终会在添加另一个首选项字段的新迁移之前执行。在调用期间get_default_expiration_date(),Preferences 对象是最新版本,但数据库尚未获得最新的迁移,并且出现错误column preferences.new_preference does not exist。
解决这个问题的最佳方法是什么?
现在,我在测试期间禁用迁移作为解决方法,但我想知道是否还有其他方法。
我尝试从应用程序注册表中获取模型get_default_expiration_date(),但它仍然是最新的模型,而不是您在函数中给出的版本模型migrations.RunPython。
我还尝试将获取对象的行包装Preferences在 try/ except 块中,但数据库最终处于回滚状态,我无法继续。
其他位:
Preferences实际上是使用 django-solo 的数据库单例。更新:澄清操作顺序
以下是正在发生的事情的时间表:
preferences/migrations/initial_0001.py:初始偏好,包括expiration_daysbusiness/migrations/initial_0001.py:初始业务对象,取决于 …在 fb 开发人员文档中的 oauth 身份验证 api - 在确认身份部分有以下注释:
请注意,您还可以生成自己的状态参数并将其与登录请求一起使用以提供 CSRF 保护。
您能帮忙解释一下这背后的具体含义吗?我的意思是,即使我生成了一个状态参数,我将如何使用它?我是否将其编码为身份验证请求 URL 的一部分?即使我这样做了又能有什么目的呢?
authentication facebook fbconnect facebook-graph-api oauth-2.0
我最近在 Django 文档中看到关于字段属性的这段话:related_nameForeignKey
\n\n\n如果您\xe2\x80\x99d 希望 Django 不创建向后关系,请将其设置
\n\nrelated_name为\'+\'或以 结尾\'+\'。例如,这将确保User模型 won\xe2\x80\x99t 与此模型具有向后关系:Run Code Online (Sandbox Code Playgroud)\nuser = models.ForeignKey(\n User,\n on_delete=models.CASCADE,\n related_name=\'+\',\n)\n
在什么情况下你想这样做?
\nDjango 1.7现在要求设置迁移.不幸的是,在默认字段值中使用lambdas或类似方法会破坏此过程.
我在模型中有以下内容:
def make_uuid(type):
"""Takes an entity type identifier string as input and returns a hex of UUID2 with a
type identifier pre-pended for readability"""
return str(type)+str(uuid.uuid1().hex)
class Accounts(models.Model):
"""Model representing Accounts"""
PENDING_STATUS = 0
ACTIVE_STATUS = 1
SUSPENDED_STATUS = 2
CANCELLED_STATUS = 3
BETA_STATUS = 4
STATUS_CHOICES = (
(PENDING_STATUS, 'Pending'),
(ACTIVE_STATUS, 'Active'),
(SUSPENDED_STATUS, 'Suspended'),
(CANCELLED_STATUS, 'Cancelled'),
(BETA_STATUS, 'Beta'),
)
account_name = models.CharField(max_length=255)
account_uuid = models.CharField(max_length=34, default=partial(make_uuid,'AC'), db_index=True, unique=True)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
updated_by = models.ForeignKey(User, …Run Code Online (Sandbox Code Playgroud) 我正在使用Django 1.11。我settings.py已配置以下内容:
TIME_ZONE = 'Asia/Calcutta'
USE_I18N = True
USE_L10N = True
USE_TZ = True
Run Code Online (Sandbox Code Playgroud)
这是IST(印度标准时间)。我的系统设置为IST。MySQL current_time返回IST(运行时Django的服务器),并在IST中显示时间戳。Python datetime.now()也提供IST。
现在的问题是,我models.py有以下几个字段:
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
Run Code Online (Sandbox Code Playgroud)
数据库是MySQL。当我在其中插入任何记录时,时间戳记为UTC。我正在考虑根据此答案的建议添加一些中间件,但这并不是推荐的方法。即使已配置了所有IST,为什么还要采用UTC?我是否缺少一些需要为模型单独设置的配置?
请注意,这个问题与我所要求的不同。我想更改整个时区,以便它在模型中也有效。
我设置USE_TZ = True和TIME_ZONE。
当我添加datetime时区对象时,它只存储 UTC 时间,即使我将本地datetime tzinfo.
之后,当我得到我用本地时区放置的日期时间时,它仍然返回 UTC 日期时间。
我的问题是
首先有没有办法从 django 模型而不是 utc得到 local( settings.TIME_ZONE) datetime?
我知道如果我打电话就可以完成,timezone.localtime(..)但我希望 Django 自动返回本地时间。
这意味着ModelClass.objects.get(..).datetimeColunm返回本地datetime对象而不是 utc。
其次,有什么方法可以在 Django 中更改数据库会话时区?我想如果我可以在 Django 中更改 DB 会话时区,我可以获得 localtimedatetime对象,因为 DB 返回本地datetime到 Django。