在 model_or_iterable 中看到模型的错误寄存器:TypeError: 'type' object is not iterable

Ran*_*ana 3 django django-models

我有以下模型

from django.db import models

# Create your models here.

class Post(models.Model):
    text = models.TextField()

    def __str__(self):
        return self.text[:50]


POWER_CHOICES= (('O', 'ON'),
                ('F','OFF')
        )

STATE_CHOICES =(('AV','Available'),
               ('U','In Use '),
               ('NU','Do Not Use')                
       )

class Device(models.Model):

   name = models.CharField(unique=True,max_length=50 )

   ipaddress=models.ForeignKey('Ipaddress', on_delete=models.CASCADE,)

   devicetype= models.ForeignKey('DeviceType', on_delete=models.CASCADE)
   model= models.ForeignKey('DeviceModel', on_delete=models.CASCADE)
   description= models.TextField(max_length=400)
   location= models.ForeignKey('Location', on_delete=models.CASCADE)
   group= models.ForeignKey('DeviceGroup', on_delete=models.CASCADE)
   managment= models.CharField(max_length=100)
   power= models.CharField(max_length=6, choices=POWER_CHOICES)
   offtime= models.CharField(max_length=30)
   state= models.CharField(max_length=10, choices=STATE_CHOICES)
   user= models.CharField(max_length=100)
#   department= models.ForeignKey('Department',on_delete=models.CASCADE)
   comments= models.CharField(max_length=200)

   def __unicode__(self):
        return self.name[:50]

class DeviceType(models.Model):
    name= models.CharField(max_length=100, unique=True)

    def __unicode__(self):
        return self.name[:50]

class DeviceModel(models.Model):
    name= models.CharField(max_length=100, unique=True)

    def __unicode__(self):
        return self.name[:50]

class Ipaddress(models.Model):
    address=models.CharField(max_length=20, unique=True)
    owner=models.CharField(max_length=200)
    loation=models.CharField(max_length=200)
    note =models.TextField()
    def __unicode__(self):
        return self.address[:50]

class Department:
    name= models.CharField(max_length=100, unique=True)
    def __unicode__(self):
        return self.name[:50] 


class DeviceGroup:
    name= models.CharField(max_length=100, unique=True)
    def __unicode__(self):
        return self.name[:50] 

class Location:
    description= models.CharField(max_length=100, unique=True)
    def __unicode__(self):
        return self.description[:50] 
Run Code Online (Sandbox Code Playgroud)

我的管理页面如下所示:

from django.contrib import admin
from pages.models import Post, Device, DeviceType, DeviceModel, Ipaddress, DeviceGroup, Location

admin.site.register(Post)
admin.site.register(Device)
admin.site.register(DeviceType)
admin.site.register(DeviceModel)
admin.site.register(Ipaddress)
#admin.site.register(Department)
admin.site.register(DeviceGroup)
admin.site.register(Location)
Run Code Online (Sandbox Code Playgroud)

我看到以下错误,但不确定导致此错误的原因。有人可以给我一些想法。请

...
...
File "C:\Users\mohiuddin_rana\labmcproject\pages\admin.py", line 10, in <module>
    admin.site.register(DeviceGroup)
  File "C:\Users\mohiuddin_rana\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\contrib\admin\sites.py", line 102, in register
    for model in model_or_iterable:
TypeError: 'type' object is not iterable
Run Code Online (Sandbox Code Playgroud)

Wil*_*sem 10

对于您的某些模型,您忘记将其从models.Model以下子类化:

class Department(models.Model):
    name= models.CharField(max_length=100, unique=True)
    def __unicode__(self):
        return self.name[:50] 


class DeviceGroup(models.Model):
    name= models.CharField(max_length=100, unique=True)
    def __unicode__(self):
        return self.name[:50] 

class Location(models.Model):
    description= models.CharField(max_length=100, unique=True)
    def __unicode__(self):
        return self.description[:50]
Run Code Online (Sandbox Code Playgroud)

这种变化也将导致一些迁移,因为到目前为止,Django的(可能)不明白,这些类实际上是模型,因此并没有构建数据库当量。

当您将模型注册到admin.site变量时,Django 需要一个模型,但检查失败。作为“回退”机制,它会检查您是否提供了可迭代的模型,但这又失败了,因为它只是一个“普通”类。

当我们检查函数 [GitHub]源代码register(..)时,可以确认这种行为:

def register(self, model_or_iterable, admin_class=None, **options):

    # ...

    admin_class = admin_class or ModelAdmin
    if isinstance(model_or_iterable, ModelBase):
        model_or_iterable = [model_or_iterable]
    for model in model_or_iterable:
        # ...
        pass
Run Code Online (Sandbox Code Playgroud)

(我删除了一些部分以使语义更清晰)。

如您所见,它会检查model_or_iterable您传递的是否是模型。如果是这种情况,它将它包装在一个列表中,否则它假定它是一个可迭代的,并旨在对其进行迭代。

注意:看起来您使用__unicode__,但同时使用 Python-3.x。__unicode__据我所知,在 Python-3.x 数据模型中没有任何意义。你应该__str__改用。