仅具有权限的Django模型定义了中断测试

时间:2015-08-06 20:49:56

标签: python django unit-testing permissions models

我在我的应用程序模型中使用元类来定义应用程序级别权限,没有定义实际字段。这按预期工作,但当我尝试运行我的测试时,我得到django.db.utils.OperationalError:没有这样的表:xxx_xxx。有没有办法在运行单元测试时排除模型?

class feeds(models.Model):
    class Meta:
        permissions = (
            ("change_feed_defaults", "change_feed_defaults"),
            ("view_logs", "view_logs"),
            ("preview_tagger", "preview_tagger"),
            ("preview_url", "preview_url"),
            ("view_feeds", "view_feeds"),
            ("text_tag_feedback", "text_tag_feedback"),
        )

2 个答案:

答案 0 :(得分:0)

由于你没有提供完整的堆栈跟踪,我只能猜测是怎么回事。

django.db.utils.OperationalError: no such table: yourapp_yourmodel.很常见 数据库出现的错​​误无法反映您的模型。

如果您正在使用django>=1.7,可能只需使用python manage.py makemigrations yourapp创建相应的迁移文件。 您可能想阅读the documentation section that explains migrations。它是一个非常有用的工具,也可以管理您的数据库状态(添加模型,字段等),但有时候很难搞清楚整个情况。

答案 1 :(得分:0)

我尝试了同样的事情..用假模型来保存额外的权限..我还有其他问题..和你的不一样..但问题..所以我决定采取公牛的角和写一些明确创建额外权限的代码,我把这些代码放在我的库中:

from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.models import Permission

def get_or_create_permission(codename, name, content_type):
    permission = Permission.objects.filter(content_type=content_type, codename=codename).first()

    if not permission:
        permission =  Permission.objects.create(content_type=content_type, codename=codename, name=name)
        print "Created Permission: %s in content type: %s" % (permission, content_type,)
    else:
        print "Found Permission: %s in ContentType: %s" % (permission, content_type,)

    return permission

def get_or_create_content_type(app_label, name, model):
      content_type = ContentType.objects.filter(app_label=app_label, model=model).first()
    if not content_type:
        content_type = ContentType.objects.create(app_label=app_label, model=model, name=name)
        print "Created ContentType: %s" % content_type
    else:
        print "Found ContentType: %s" % content_type

    return content_type

现在在您的urls.py中(或在启动时将执行的任何其他地方):

content_type = get_or_create_content_type('appname', 'Feeds', 'feeds')
get_or_create_permission('change_feed_defaults', 'Change Feed Defaults', content_type)
get_or_create_permission('view_logs', 'View Logs', content_type)
# etc

这可确保您的权限在启动时存在。有一天我会为此制作一个包装器,这样我只需要传递权限字典,它就可以在一个函数调用中完成所有操作...