Внешний ключ Django postgresql
у меня есть это 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()
когда я запускаю syncdb против postgresql, он заканчивается ошибкой:
~/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.
2 ответов
код выглядит в порядке на первый взгляд. Я подозреваю, что это проблема, связанная с базой данных.
как max_length
s при условии, довольно огромные, попробуйте уменьшить max_length
s К чему-то TextField вместо CharField
.
в противном случае попробуйте переименовать поле service
на Service
и/или ServiceCheck
.
проблема, которую вы нажмете, на самом деле связана с тем, как Postgres-XC/StormDB (или теперь Postgres-XL, где я попал в эту проблему) обрабатывает разделение таблиц между различными датанодами.
В основном проблема заключается в том, что компонент database engine не может гарантировать ограничения на внешние ключи или уникальные ограничения. Per an old статьи на сайте StormDB о предыдущей версии Django и Postgres-XC / StormDB вы можете сделать это, установив loose_constraints=true
на базе. В современные версии (1.6 или новее), эквивалент представляется задание db_constraint=False
на иностранном ключе в соответствии с документами поля модели Django (которые я не могу напрямую связать, поскольку у меня недостаточно репутации).
другое решение, если вы больше обеспокоены доступностью, а не производительностью, - это репликация данных, что означает, что у вас не будет проблемы, потому что все datanodes имеют одинаковые данные.
Я не знаю, как это сделать непосредственно в Django, но вы можете изменить свой создание таблицы для использования DISTRIBUTE BY REPLICATION
Как подробно описано в СОЗДАТЬ ТАБЛИЦУ документы.