【问题标题】:Django models relationship collisionDjango 模型关系冲突
【发布时间】:2018-01-15 12:41:47
【问题描述】:

我是 django 学习者,我对 django 关系概念有疑问。 我编写了两个与单源模型(UserProfile)有关系的模型。但其中一个不能正常工作。Message 类与它的两个字段(发送者、接收者)一起工作正常,但另一个类(类)导致

编程错误:关系“CEA_class”已经存在

CEA 是我的应用名称。我真的更喜欢为班级设置两个不同的字段,而不是将它们作为单个字段加入。我想用它做什么?

类消息---->工作正常

class Message(models.Model):
    sender = models.ForeignKey(UserProfile,blank=False,related_name="sender")
    receiver = models.ForeignKey(UserProfile,blank=False,related_name="receiver")
    content = models.CharField(max_length=200)
    priority = models.BigIntegerField(choices=PRIORITY_LIST,default=1)

class Class ---->导致错误的类

class Class(models.Model):
    subject = models.CharField(max_length=20)
    time = models.CharField(max_length=20)
    day = models.CharField(max_length=20)
    location = models.CharField(max_length=20)    
    students = models.ManyToManyField(UserProfile,blank=True,related_name="students")
    master = models.ForeignKey(UserProfile,blank=True,related_name="master")

这是我的整个 UserProfile 类

class UserProfile(models.Model):

    user=models.OneToOneField(User, 
    related_name='UserProfile',on_delete=models.CASCADE)
    field=models.CharField(max_length=20,default="ce")
    userPhoto=models.ImageField(upload_to='documents/',blank=True)
    Type=models.BigIntegerField(choices=USER_TYPE,default=2)
    gender=models.BigIntegerField(choices=GENDER_TYPE,default=1)
    def __str__(self):
        return self.user.username




#The decorator can also takes extra arguments which are passed onto the 
   signal
   @receiver(post_save,sender=User)
   def create_or_update_UserProfile(sender, instance, created, **kwargs):
    if created:
        UserProfile.objects.create(user=instance)
    instance.UserProfile.save()

我的管理页面出现如下错误: .

/admin/CEA/class/ 处的编程错误

列 CEA_class.master_id 不存在 LINE 1: ...time", "CEA_class"."day", "CEA_class"."location", "CEA_class...

【问题讨论】:

  • 我认为问题不是因为 Django,我认为您需要做的就是删除表并再次运行 migrate。你用的是哪个数据库?? PostgreSQL?
  • 并尝试使用除 Class 之外的其他名称,使用内置关键字作为表名会令人困惑
  • 是的,我使用 postrgreSQL,我尝试刷新数据库或再次迁移数据,但没有成功。我尝试重置迁移,就像网络上存在的一样(simpleisbetterthancomplex.com/tutorial/2016/07/26/…),但我还有问题。
  • 当我试图通过管理页面编辑类时,它会导致 ProgrammingError:column CEA_class.master_id 不存在。
  • 当我删除“master”字段时,一切正常

标签: django model relational-database relationship


【解决方案1】:

我不久前解决了这个问题,并在 Django doc 中找到了一些参考资料,但实际上我仍然不太确定为什么需要这样做,因为底层 SQL 结构不需要(据我所知在我自己的数据库中)显示相关名称的差异 - 它似乎是一个内部 Django 问题,而不是一个实际的 SQL 问题。在任何情况下,当您在一个表中有多个字段与同一个其他模型相关时,除了一个之外,所有字段都必须引用该类才能让 Django 保持正确。将类添加到模型中存在一致性问题的所有相关名称通常是最干净的,尽管我检查了自己的代码,有时我会这样做,有时我不会这样做:

students = models.ManyToManyField(UserProfile,blank=True,related_name="%(class)s_students")
master = models.ForeignKey(UserProfile,blank=True,related_name="%(class)s_master")

【讨论】:

  • 这很有帮助,但我仍然遇到问题。我更新了帖子。也许我对所有事情都不小心,我的问题出在其他地方:\\。
  • @salehafzoon 您仍然收到programing error:relation "CEA_class" already exists 错误吗?还是那已经消失并被另一个错误所取代?您是否能够运行迁移?
  • 是的。在迁移中,当它告诉我为列设置默认 id 值时,我只输入了一个像 1 这样的数字。我认为因为我输入了没有有效的 id,所以我有一个错误。
  • @salehafzoon - 撤消迁移并将其删除,添加 null=True: master = models.ForeignKey(UserProfile,null=True,blank=True,related_name="%(class)s_master") 并进行新的迁移并迁移。
【解决方案2】:

毕竟我得出这个结论,删除导致问题的烦人无关数据的最佳方法是临时重命名模型并迁移,然后将其重命名为它的名字。通过这种方式,django 本身负责删除关系以及数据库中导致您的问题的每个数据。


有了所有这些解释,所有建议的答案都很有帮助,但我认为简单更好,为什么不呢。 :))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-22
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2013-11-09
    • 2019-07-30
    相关资源
    最近更新 更多