Cql模型错误ModelMetaClass对象不可迭代

时间:2016-02-20 11:21:27

标签: django django-models cassandra

二手应用:

当尝试在管理站点中注册我的模型时,我收到此错误:

  

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评论我必须自己设置。

现在的问题是,我该怎么办?

1 个答案:

答案 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的一个实例,或者以某种方式修补私有字段或者更深入地重构模型。但我不确定这是一种更好的方式。