CommandError: One or more models did not validate

15 浏览
0 Comments

CommandError: One or more models did not validate

在Django中,对于一个之前使用Python和Django的版本工作的项目(即:可能这是一个移植问题),我得到以下错误:

CommandError: 一个或多个模型未通过验证:

directory.phone:与字段'Entity.phone'的字段'entity'的反向查询名称冲突。在'entity'的定义中添加related_name参数。

我需要做什么?我的models.py文件如下:

#!/usr/bin/python
# coding = UTF-8
from django.contrib import admin
from django.contrib.contenttypes import generic
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ValidationError
from django.db import models
import datetime
import directory
import django.forms
import re
OFFICE_CHOICES = (
  (u'CN', u'美国伊利诺伊州芝加哥北办公室'),
  (u'CS', u'美国伊利诺伊州芝加哥南办公室'),
  (u'WH', u'美国伊利诺伊州惠顿办公室'),
  (u'SY', u'澳大利亚新南威尔士州悉尼办公室'),
  )
EDIT_CHOICES = (
  (u'a', u'外键关系已更改。'),
  (u'b', u'图像已更改。'),
  (u'c', u'创建实例。'),
  (u'd', u'删除实例。'),
  (u'e', u'添加多对多关系。'),
  (u'f', u'删除多对多关系。'),
  (u'g', u'添加一对多关系。'),
  (u'h', u'删除一对多关系。'),
  (u'i', u'文本已更改。'),
  )
TIME_ZONE_CHOICES = (
  (None, "选择"),
  ("1.0", "A: 巴黎, +1:00"),
  ("2.0", "B: 雅典, +2:00"),
  ("3.0", "C: 莫斯科, +3:00"),
  ("4.0", "D: 迪拜, +4:00"),
  ("4.5", "-: 喀布尔, +4:30"),
  ("5.0", "E: 卡拉奇, +5:00"),
  ("5.5", "-: 新德里, +5:30"),
  ("5.75", "-: 加德满都, :5:45"),
  ("6.0", "F: 达卡, +6:00"),
  ("6.5", "-: 仰光, +6:30"),
  ("7.0", "G: 雅加达, +7:00"),
  ("8.0", "H: 吉隆坡, +8:00"),
  ("9.0", "I: 东京, +9:00"),
  ("9.5", "-: 阿德莱德, +9:30"),
  ("10.0", "K: 悉尼, +10:00"),
  ("10.5", "-: 豪勋爵岛, +10:30"),
  ("11.0", "L: 所罗门群岛, +11:00"),
  ("11.5", "-: 诺福克岛, +11:50"),
  ("12.0", "M: 奥克兰, +12:00"),
  ("12.75", "-: 查塔姆群岛, +12:45"),
  ("13.0", "-: 汤加, +13:00"),
  ("14.0", "-: 林恩群岛, +14:00"),
  ("-1.0", "N: 亚速尔群岛, -1:00"),
  ("-2.0", "O: 费尔南多·迪诺罗尼亚, -2:00"),
  ("-3.0", "P: 里约热内卢, -3:00"),
  ("-3.5", "-: 圣约翰斯, -3:50"),
  ("-4.0", "Q: 圣地亚哥, -4:00"),
  ("-4.5", "-: 加拉加斯, -4:30"),
  ("-5.0", "R: 纽约市, -5:00"),
  ("-6.0", "S: 芝加哥, -6:00"),
  ("-7.0", "T: 博尔德, -7:00"),
  ("-8.0", "U: 洛杉矶, -8:00"),
  ("-9.0", "V: 安克雷奇, -9:00"),
  ("-9.5", "-: 马克萨斯群岛, -9:30"),
  ("-10.0", "W: 夏威夷, -10:00"),
  ("-11.0", "X: 萨摩亚, -11:00"),
  ("-12.0", "Y: 贝克岛, -12:00"),
  ("0.0", "Z: 伦敦, +0:00"),
  )
FOREIGN_KEY_RELATIONSHIP_CHANGED = u'a'
IMAGE_CHANGED = u'b'
INSTANCE_CREATED = u'c'
INSTANCE_DELETED = u'd'
MANY_TO_MANY_RELATIONSHIP_ADDED = u'e'
MANY_TO_MANY_RELATIONSHIP_DELETED = u'f'
MANY_TO_ONE_RELATIONSHIP_ADDED = u'g'
MANY_TO_ONE_RELATIONSHIP_DELETED = u'h'
TEXT_CHANGED = u'i'
class EditTrail(models.Model):
    change_set = models.IntegerField()
    change_type = models.CharField(max_length = 1, choices = EDIT_CHOICES)
    content_object = generic.GenericForeignKey(u'content_type', u'object_id')
    content_type = models.ForeignKey(ContentType)
    field_name = models.TextField(null = True, blank = True)
    foreign_key_added = generic.GenericForeignKey()
    foreign_key_deleted = generic.GenericForeignKey()
    in_effect = models.BooleanField()
    instance = generic.GenericForeignKey()
    ip = models.IPAddressField()
    object_id = models.PositiveIntegerField()
    session = models.TextField(null = True, blank = True)
    text_after = models.TextField(null = True, blank = True)
    text_before = models.TextField(null = True, blank = True)
    timestamp = models.DateTimeField(default = datetime.datetime.now, blank =
      True)
    username = models.TextField(null = True, blank = True)
    def format_timestamp(self):
        return directory.functions.format_timestamp(self.timestamp)
class ExtensionField(models.TextField):
    def __init__(self, *arguments, **keywords):
        models.TextField.__init__(self, *arguments, **keywords)
def gps_validator(value):
    # Create a normalized working copy of the value.
    working_copy = value
    working_copy = working_copy.replace(u'\n', u',')
    working_copy = working_copy.replace(u'\r', u',')
    working_copy = re.sub(ur',*$', '', working_copy)
    working_copy = re.sub(ur',+', u',', working_copy)
    if not u',' in working_copy and not \
      re.match(ur'.* .* .*', working_copy):
        working_copy = working_copy.replace(u' ', u',')
    working_copy = re.sub(u'[\00B0\2018\2019\201C\201D\'"]', ' ', working_copy)
    working_copy = working_copy.replace(u',', u', ')
    working_copy = re.sub(ur'\s+', u' ', working_copy)
    working_copy = working_copy.strip()
    working_copy = working_copy.upper()
    # Test the normalized working copy against regular expressions for different kinds of GPS format.
    if re.match(ur'[-NS]? ?\d{1,3} [0-5]\d [0-5]\d(\.\d+)[NS]?, [-EW]? ?\d{1,3} [0-5]\d [0-5]\d(\.\d+)[EW]?', working_copy):
        return working_copy
    elif re.match(ur'[-NS]? ?\d{1,3} [0-5]\d(\.\d+)[NS]?, [-EW]? ?\d{1,3} [0-5]\d(\.\d+)[EW]?', working_copy):
        return working_copy
    elif re.match(ur'[-NS]? ?\d{1,3}(\.\d+)[NS]?, [-EW]? ?\d{1,3}(\.\d+)[EW]?', working_copy):
        return working_copy
    else:
        raise ValidationError(u'我们无法将其识别为有效的GPS坐标。')
class GPSField(models.TextField):
    default_error_messages = {
        u'invalid': u'我们无法将其识别为有效的GPS坐标。',
      }
    default_validators = [gps_validator]
class Increment(models.Model):
    pass
class Location(models.Model):
    identifier = models.TextField(blank = True)
    description = models.TextField(blank = True)
    office = models.CharField(max_length=2, choices=OFFICE_CHOICES, blank =
      True)
    postal_address = models.TextField(blank = True)
    room = models.TextField(blank = True)
    coordinates = GPSField(blank = True)
class TextURLField(models.URLField):
    def __init__(self, *arguments, **keywords):
        models.URLField.__init__(self, *arguments, **keywords)
    def get_internal_type(self):
        return u'TextField'
# This class is basically the "Person" class; however, it is called "Entity"
# to emphasize that it is intended to accommodate people, offices,
# organizational units, and possibly other areas.
class Entity(models.Model):
    active = models.BooleanField(blank = True)
    department = models.ForeignKey(u'self', blank = True, null =
      True, related_name = u'member')
    description = models.TextField(blank = True)
    gps = GPSField()
    image_mimetype = models.TextField(blank = True, null = True)
    is_invisible = models.BooleanField(default = False)
    location = models.ForeignKey(u'self', blank = True, null = True,
      related_name = u'occupant')
    name = models.TextField(blank = True, default =
      directory.settings.PLACEHOLDER_NAME)
    observes_daylight_saving_time = models.BooleanField(blank = True, default
      = True)
    other_contact = models.TextField(blank = True)
    postal_address = models.TextField(blank = True)
    publish_externally = models.BooleanField(blank = True)
    reports_to = models.ForeignKey(u'self', blank = True, null = True,
      related_name = u'subordinate')
    start_date = models.DateField(blank = True, null = True)
    time_zone = models.CharField(max_length = 5, null = True, choices =
      TIME_ZONE_CHOICES)
    title = models.TextField(blank = True)
    class Meta:
        permissions = (
          ("view_changelog", "查看编辑记录"),
          )
class Tag(models.Model):
    entity = models.ForeignKey(Entity)
    is_invisible = models.BooleanField(default = False)
    text = models.TextField(blank = True)
    def __eq__(self, other):
        try:
            return self.text == other.text
        except:
            return False
class TextEmailField(models.EmailField):
    #entity = models.ForeignKey(Entity)
    def __init__(self, *arguments, **keywords):
        models.EmailField.__init__(self, *arguments, **keywords)
    def get_internal_type(self):
        return u'TextField'
class Email(models.Model):
    email = TextEmailField()
    entity = models.ForeignKey(Entity)
    is_invisible = models.BooleanField(default = False)
class URL(models.Model):
    entity = models.ForeignKey(Entity)
    url = TextURLField()
    is_invisible = models.BooleanField(default = False)
class Phone(models.Model):
    description = models.TextField(blank = True, null = True)
    entity = models.ForeignKey(Entity, blank = True)
    is_invisible = models.BooleanField(default = False)
    number = models.TextField(blank = True)
    def __eq__(self, other):
        try:
            return self.remove_formatting() == other.remove_formatting()
        except:
            return False
    def remove_formatting(self):
        return re.sub(ur'\D', u'', str(self))
class Status(models.Model):
    datetime = models.DateTimeField(default = datetime.datetime.now, blank = True)
    entity = models.ForeignKey(Entity, blank = True)
    is_invisible = models.BooleanField(default = False)
    text = models.TextField(blank = True)
    username = models.TextField(blank = True)
    def format_timestamp(self):
        return directory.functions.format_timestamp(self.datetime)
class EntityForm(django.forms.ModelForm):
    class Meta:
        model = Entity
        fields = (u'name', u'description', u'phone', u'department',
          u'postal_address', u'reports_to', u'active', u'publish_externally')
class LocationForm(django.forms.ModelForm):
    class Meta:
        model = Location

0
0 Comments

(CommandError: One or more models did not validate)这个错误通常出现在Django项目中,表示一个或多个模型未通过验证。这可能是由于模型定义中存在错误或不一致导致的。要解决这个问题,可以尝试以下方法:

1. 重置数据库:首先尝试重置数据库,这将清除所有数据,并重新创建数据库。可以使用以下命令来执行此操作:

   python manage.py flush
   

2. 删除所有迁移文件:如果重置数据库后问题仍然存在,可以尝试删除所有迁移文件,然后重新运行迁移。可以使用以下命令删除迁移文件:

   rm -rf /migrations
   

3. 重新运行迁移:删除迁移文件后,重新运行迁移命令以创建新的迁移文件和数据库表:

   python manage.py makemigrations
   python manage.py migrate
   

4. 检查模型定义:如果上述步骤都无效,可能是模型定义中存在错误或不一致。请仔细检查模型定义,确保字段、关联和选项等都正确设置。确保模型类名和外键等引用正确。

通过按照上述步骤逐一排除可能的问题,您应该能够解决(CommandError: One or more models did not validate)这个错误,并使Django项目正常运行。

0
0 Comments

Phone的定义中,为entity属性添加以下参数:related_name = "entity_phone"

Django会自动在模型中构建反向关系,有时它选择的名称会与其他已存在的相关名称冲突。因此,您可以显式地设置这些名称以避免冲突。

原因:出现(CommandError: One or more models did not validate)错误的原因是Django自动构建的反向关系名称与其他已存在的相关名称发生冲突。

解决方法:为Phoneentity属性添加related_name = "entity_phone"参数,显式地设置反向关系名称,以避免冲突。

0
0 Comments

(CommandError: One or more models did not validate)这个问题的出现原因是在Phone模型中,entity字段的外键关联未通过验证。该字段的定义如下:

class Phone(models.Model):    
    entity = models.ForeignKey(Entity, blank = True, related_name="someName")

解决方法是检查并确保Entity模型已经正确定义和验证。

0