二手应用:
当尝试在管理站点中注册我的模型时,我收到此错误:
Typerror:' ModelMetaClass'对象不可迭代
my models.py:
from cassandra.cqlengine import columns
from cassandra.cqlengine import models
class ApiModel(models.Model):
id = columns.BigInt(primary_key=True)
content = columns.Text()
created_at = columns.DateTime()
我的admin.py:
#!/usr/bin/python
# -*- coding: utf-8 -*-
from django.contrib import admin
from myapp.models import ApiModel
class ApisAdmin(admin.ModelAdmin):
pass
admin.site.register(ApiModel, ApisAdmin)
据我所知,cql引擎没有自我 META 和this评论我必须自己设置。
现在的问题是,我该怎么办?
答案 0 :(得分:1)
我认为你应该在课堂上添加“Meta”课程,如下所示:
class ApiModel(models.Model):
id = columns.BigInt(primary_key=True)
content = columns.Text()
created_at = columns.DateTime()
class Meta:
db_table = 'tablename'
verbose_name = 'name_for_verbose_presentation'
... and so one
因为在你的链接作者直接说“cqlengine即将合并到python驱动程序中。之后我们可以考虑它,但重要的是要知道,django-cassandra-engine从未意味着完全与django模型兼容。“你应该准备好你可以得到另一个问题。 在定义Meta类之后,我相信Django会抛出另一个错误,可能是因为它遗漏了一些字段。所以你需要添加所需的字段。
<强>更新强>
所以,现在看起来我明白了。
在Django的register
方法中查看这一行:
https://github.com/django/django/blob/master/django/contrib/admin/sites.py#L83
if isinstance(model_or_iterable, ModelBase):
model_or_iterable = [model_or_iterable]
如果您正在注册默认的Django模型,它将是ModelBase的实例,它将被包装到列表中。如果不是,它将保持一个类,并在下一行Django将尝试迭代类并且不会迭代异常。
由于您注册的不是Django模型,因此它不是ModelBase的实例。因此,它不会被包装到列表中,并且您将获得异常。
我不确定它是否是'正确'的方法来解决它,但我已经尝试将类包装到列表中并且它对我有用:
admin.site.register([ApiModel], ApisAdmin)
其他方法是尝试使这个模型成为ModelBase的一个实例,或者以某种方式修补私有字段或者更深入地重构模型。但我不确定这是一种更好的方式。