Django PostgreSQL 外键

7

我有这个models.py文件

from django.db import models
from django.contrib.auth.models import User

class Service(models.Model):
    user = models.ForeignKey(User)
    name = models.CharField(max_length=800, blank=False)
    service = models.CharField(max_length=2000, blank=False)
    def __unicode__(self):
        return self.name

class ServiceCheck(models.Model):
    service = models.ForeignKey(Service)
    check_status = models.CharField(max_length=80)
    check_time = models.DateTimeField()

当我在PostgreSQL上运行syncdb时,出现了错误:
~/dev-md> sudo python manage.py syncdb
Creating tables ...
Creating table monitor_service
Creating table monitor_servicecheck

DatabaseError: Hash/Modulo distribution column does not refer to hash/modulo distribution column in referenced table.

你确定在你的models.py文件中Service和ServiceCheck是按照正确的顺序定义的吗?我问这个问题是因为你的输出应该显示monitor_service表首先被创建。 - Talvalin
是的,Talvalin 正确排序。 - user1893198
还有其他应用程序吗?这段代码应该可以运行。 - sneawo
什么是数据库?最近我在使用基于Postgres-XC的StormDB时遇到了问题,但是相同的SQL在我的本地PostgreSQL上可以正常工作。 - alanjds
是的,我之前使用的是StormDB,我的代码没问题,但这些人在PostgreSQL上手动进行了数据库事务。我认为你需要更改Django数据库自动提交设置。 - user1893198
显示剩余2条评论
2个回答

2

初看代码看起来没问题。我怀疑这是一个与数据库相关的问题。

由于提供的max_length非常大,请尝试将max_length减小到<= 255,或者使用TextField而不是CharField

如果这样还不行,请尝试将字段service重命名为Service和/或ServiceCheck


1
您遇到的问题实际上与Postgres-XC / StormDB(或现在的Postgres-XL,在这里我遇到了这个问题)如何处理不同数据节点之间表的分区有关。
基本上,问题在于数据库引擎无法保证外键约束或唯一约束。根据StormDB网站上有关先前版本Django和Postgres-XC / StormDB的旧article,您可以通过在数据库上设置loose_constraints=true来解决此问题。在现代版本的Django(1.6或更高版本)中,相当于根据Django的模型字段文档在ForeignKey上设置db_constraint=False(由于我没有足够的声誉,因此无法直接链接)。
如果你更关注可用性而不是性能,另一种解决方案是复制数据,这意味着你不会有问题,因为所有的datanode都有相同的数据。我不知道如何直接在Django中实现这一点,但可以修改表创建,使用详细介绍的DISTRIBUTE BY REPLICATION方式。请参阅CREATE TABLE文档。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接