我将一个项目推到了heroku上,似乎无法在它的makemigrations上获胜。
所以我首先认为一切都很好。推送之后,我进行了迁移并创建了超级用户。除以下部分外,其他所有内容都看起来不错,并且管理员可以正常使用:accounts_userprofileinfo。一旦我尝试在管理员中单击该表,就会显示此错误:
内部服务器错误:/ admin / accounts / userprofileinfo /
回溯(最近通话最近一次):
文件 “ /app/.heroku/python/lib/python3.6/site-packages/django/db/backends/utils.py”, 第65行,执行 返回self.cursor.execute(sql,params)
psycopg2.ProgrammingError:列accounts_userprofileinfo.daca确实有 不存在
第1行:SELECT“ accounts_userprofileinfo”。“ id”, “ accounts_userprofil ...
通常,您不会在实时服务器上进行makemigrations,但是我认为它可以解决此问题,所以我做到了。令人惊讶的是,结果:
Migrations for 'auth':
.heroku/python/lib/python3.6/site-packages/django/contrib/auth/migrations/0009_auto_20180709_2242.py
- Alter field email on user
在本地,我的迁移是有结果的:没有任何变化,但是一切正常。有趣的是,heroku postgres不管我执行makemigrations的频率如何,同一件事随着身份验证的迁移而不断出现,就像它没有保存一样。不知道这是否导致我的account_userprofileinfo服务器错误,但可能会这样。
帐户模型:
User._meta.get_field('email').__dict__['_unique'] = True
class UserProfileInfo(models.Model):
TYPE_CHOICES = (
('yes', 'yes'),
('no', 'no'),
)
POSITION_CHOICES = (
('President', 'President'),
('Vize-President', 'Vize-President'),
('Secretary', 'Secretary'),
('Member', 'Member'),
)
daca = models.CharField(max_length=100, choices=TYPE_CHOICES, default="no")
committee = models.CharField(max_length=30, choices=POSITION_CHOICES, default="Member")
user = models.OneToOneField(User)
city = models.CharField(max_length=75, blank=False, default='')
mobile = models.CharField(max_length=16,blank=False, default='')
experience = models.IntegerField(blank=False, default='0')
profile_picture = ThumbnailerImageField(upload_to='profile_pics',blank=True, default='/placeholder/neutral3.png',
resize_source=dict(size=(550, 700)))
joined_date = models.DateTimeField(default=timezone.now, blank=True, null=True,editable=False)
def __str__(self):
# Built-in attribute of django.contrib.auth.models.User !
return self.user.first_name + " " + self.user.last_name
def create_profile(sender, **kwargs):
user = kwargs["instance"]
if kwargs["created"]:
user_profile = UserProfileInfo(user=user)
user_profile.save()
post_save.connect(create_profile, sender=User)
有什么想法吗?谢谢
答案 0 :(得分:2)
还运行manage.py迁移。另外,我不确定您是否真的需要User._meta.get_field('email').__dict__['_unique'] = True
。猴子修补默认模型会导致在Django本身内部创建新的迁移,这很不好。要更改默认字段,最好创建自定义用户模型https://docs.djangoproject.com/en/2.0/topics/auth/customizing/#substituting-a-custom-user-model。但是很难在已经创建的项目中进行。因此,也许可以处理Form中的唯一检查。