psycopg2.ProgrammingError:列“ ...”不存在-通过makemigrations错误吗?

时间:2018-07-09 18:23:31

标签: django django-models django-migrations

我将一个项目推到了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)

有什么想法吗?谢谢

1 个答案:

答案 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中的唯一检查。