Внешний ключ 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_lengths при условии, довольно огромные, попробуйте уменьшить max_lengths К чему-то 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 Как подробно описано в СОЗДАТЬ ТАБЛИЦУ документы.