小编Kev*_*nry的帖子

Python mixin扩展了类属性

试图弄清楚如何为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)

python django metaclass multiple-inheritance mixins

6
推荐指数
1
解决办法
1562
查看次数

表格或模型是否应设置默认模型字段?

哪个选项最好,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)

forms django models

5
推荐指数
1
解决办法
67
查看次数

在Django Admin上使用自定义save()方法保存模型后返回错误消息

我有两个型号.一个是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.

有任何想法吗?

非常感谢!

django django-admin

5
推荐指数
1
解决办法
6145
查看次数

当"原子"块处于活动状态时,这是禁止的.Django 1.8

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)

python django transactions

5
推荐指数
1
解决办法
5151
查看次数

使用查询数据库的默认字段函数迁移时出现 Django 错误

我正在尝试创建一个可调用的默认字段,如下所示:

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 块中,但数据库最终处于回滚状态,我无法继续。

其他位:

  • 我正在使用 Django 1.8
  • 在我的实际应用程序中,该类Preferences实际上是使用 django-solo 的数据库单例。

更新:澄清操作顺序

以下是正在发生的事情的时间表:

  1. preferences/migrations/initial_0001.py:初始偏好,包括expiration_days
  2. business/migrations/initial_0001.py:初始业务对象,取决于 …

python django django-models django-migrations

5
推荐指数
1
解决办法
1854
查看次数

Facebook 手动登录流程中的状态参数有何用途?

在 fb 开发人员文档中的 oauth 身份验证 api - 在确认身份部分有以下注释

请注意,您还可以生成自己的状态参数并将其与登录请求一起使用以提供 CSRF 保护。

您能帮忙解释一下这背后的具体含义吗?我的意思是,即使我生成了一个状态参数,我将如何使用它?我是否将其编码为身份验证请求 URL 的一部分?即使我这样做了又能有什么目的呢?

authentication facebook fbconnect facebook-graph-api oauth-2.0

5
推荐指数
1
解决办法
5993
查看次数

为什么您不想在外键上创建向后关系?

我最近在 Django 文档中看到关于字段属性的这段话related_nameForeignKey

\n\n
\n

如果您\xe2\x80\x99d 希望 Django 不创建向后关系,请将其设置related_name\'+\'或以 结尾\'+\'。例如,这将确保User模型 won\xe2\x80\x99t 与此模型具有向后关系:

\n\n
user = models.ForeignKey(\n    User,\n    on_delete=models.CASCADE,\n    related_name=\'+\',\n)\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

在什么情况下你想这样做?

\n

django django-models

5
推荐指数
1
解决办法
193
查看次数

生成UUID的默认值会破坏django 1.7中的迁移,是否有解决方法?

Django 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 django-models django-migrations

4
推荐指数
1
解决办法
1122
查看次数

即使时区遍布亚洲/ Calcutta,Django模型的DateTimeField也采用UTC

我正在使用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?我是否缺少一些需要为模型单独设置的配置?

请注意这个问题与我所要求的不同。我想更改整个时区,以便它在模型中也有效。

python mysql django timezone datetime

4
推荐指数
1
解决办法
1276
查看次数

如何从 django 模型 DateTimeField 获取本地日期时间?

我设置USE_TZ = TrueTIME_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。

python django timezone datetime oracle11g

3
推荐指数
1
解决办法
1977
查看次数