CommandError: One or more models did not validate
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
(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项目正常运行。