小编mca*_*tle的帖子

验证Django模型对象的正确方法?

我仍然试图理解在模型级别使用自定义验证器验证Django模型对象的正确方法.我知道验证通常是在表单或模型中完成的.但是,如果我通过Python shell中的ORM与它进行交互,我想在模型级别确保数据的完整性.这是我目前的做法:

from django.db import models
from django.core import validators
from django.core exceptions import ValidationError


def validate_gender(value):
    """ Custom validator """
    if not value in ('m', 'f', 'M', 'F'):
        raise ValidationError(u'%s is not a valid value for gender.' % value)


class Person(models.Model):
    name = models.CharField(max_length=128)
    age = models.IntegerField()
    gender = models.CharField(maxlength=1, validators=[validate_gender])

    def save(self, *args, **kwargs):
        """ Override Person's save """
        self.full_clean(exclude=None)
        super(Person, self).save(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

这是我的问题:

  1. 我应该创建一个自定义验证函数,将其指定为验证器,然后覆盖Person的save()函数,就像我上面所做的那样?(顺便说一句,我知道我可以使用'choices'字段选项验证我的性别选择,但我为了说明的目的创建了'validate_gender').

  2. 如果我真的想确保数据的完整性,我是否应该在模型层编写Django单元测试以及使用Python/Psycopg进行等效的数据库级单元测试?我注意到,引发ValidationErrors的Django单元测试只测试模型使用数据库副本对数据库模式的理解.即使我使用South进行迁移,任何数据库级约束都限于Django可以理解并转换为Postgres约束.如果我需要一个Django无法复制的自定义约束,如果我直接通过psql终端与数据库进行交互,我可能会将数据输入到我的数据库中而违反该约束.

谢谢!

django django-models

28
推荐指数
1
解决办法
2万
查看次数

何时应该使用HStoreField而不是JSONField?

Django 1.8提供了HStoreField,而Django 1.9将为PostgreSQL提供JSONField(它使用jsonb).

我的理解是hstore比json快,但是不允许嵌套并且只允许字符串.

应该何时使用另一个?一个人应该优先于另一个吗?与jsonb相比,hstore仍然是性能的明显赢家吗?

python django postgresql hstore jsonb

17
推荐指数
1
解决办法
2124
查看次数

升级到Django 1.7.获取错误:无法序列化:<storages.backends.s3boto.S3BotoStorage对象

我正在尝试将django应用程序从django 1.6.6升级到1.7并使用python 2.7.8.当我运行时python manage.py makemigrations,我收到以下错误:

ValueError: Cannot serialize: <storages.backends.s3boto.S3BotoStorage object at 0x11116eed0>
There are some values Django cannot serialize into migration files.
Run Code Online (Sandbox Code Playgroud)

以下是相关代码:

protected_storage = storages.backends.s3boto.S3BotoStorage(
      acl='private',
      querystring_auth=True,
      querystring_expire=3600,
    )


    class Document(models.Model):
        ...
        file = models.FileField(upload_to='media/docs/', max_length=10000, storage=protected_storage)

        def __unicode__(self):
            return "%s" % self.candidate

        def get_absolute_url(self):
            return reverse('documents', args=[str(self.pk)])
Run Code Online (Sandbox Code Playgroud)

我已经阅读了迁移文档,并在这里阅读了类似的问题,但我一直无法解决这个问题.我的应用程序使用django-storages和boto将文件保存到Amazon S3上.任何帮助表示赞赏.

python django boto python-2.7 django-storage

15
推荐指数
2
解决办法
3498
查看次数

对于Django Rest Framework,HyperLinkedRelatedField和HyperLinkedIdentityField的用例有什么区别?

我当然回顾了这些文档,但是想知道是否有人可以更简洁地解释这些领域之间用例和应用程序的差异.为什么一个人使用另一个领域呢?对于OneToOne关系,这些字段之间是否存在差异?

python django django-rest-framework

11
推荐指数
2
解决办法
1630
查看次数

Kivy 应用程序需要 30 秒才能打开

It is taking about 30 seconds to open a Kivy app on iOS and Android devices (it takes only 3 seconds to open on Mac OSX... haven't tried it on Windows). The kivy-ios package is used to build the app for iOS and buildozer is used to build the app for Android.

The console log for opening the app on an iPhone is below. I'm at a loss as to what is causing the slow start time.

Aug 19 13:29:29 …
Run Code Online (Sandbox Code Playgroud)

python android ios python-2.7 kivy

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

在Django表单中将所有CharField表单字段输入转换为小写

我正在使用Django表单进行用户注册,用户可以在其中输入优惠券代码.我希望在优惠券代码字段中输入的所有字符都转换为小写.我尝试在save方法,自定义清理方法和自定义验证器中使用.lower(),但我对这些方法没有运气.以下是我的代码.

class StripeSubscriptionSignupForm(forms.Form):
    coupon = forms.CharField(max_length=30,
        required=False,
        validators=[validate_coupon],
        label=mark_safe("<p class='signup_label'>Promo Code</p>")

    def save(self, user):
        try:
            customer, created = Customer.get_or_create(user)
            customer.update_card(self.cleaned_data["stripe_token"])
            customer.subscribe(self.cleaned_data["plan"], self.cleaned_data["coupon"].lower())
        except stripe.StripeError as e:
            # handle error here
            raise e
Run Code Online (Sandbox Code Playgroud)

如上所述,我也尝试了一种清洁方法,但这也不起作用:

def clean_coupon(self):
    return self.cleaned_data['coupon'].lower()
Run Code Online (Sandbox Code Playgroud)

python django python-2.7

3
推荐指数
2
解决办法
5807
查看次数

保存Kivy应用程序的登录屏幕用户名和密码

我正在开发适用于iOS和Android的Kivy应用程序,即使应用程序关闭或被杀死,也需要帮助保持用户持久登录.我正在使用Parse来存储用户凭据.

我已经在App类中添加了一个on_pause方法,但这只会让用户在应用程序关闭但未被杀死时保持登录状态.是否有最佳实践可以安全地允许持久用户使用Kivy登录,即使应用程序被杀死后也是如此?

编辑:我更喜欢适用于Android应用和iOS应用的单一Kivy解决方案,无需编辑/添加iOS或Android特定代码.

python android ios kivy parse-platform

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