2015-04-12 3 views
0

Я создаю некоторые модели в django, чтобы представлять статьи новостей, их авторов и географический фокус для каждой статьи. Мне нужны отношения «многие ко многим» между статьей и автором и отношения «один ко многим» между статьей и местом, где каждое место может иметь более одной статьи, но не наоборот. Я пробовал различные методы, но каждый раз, когда я бегу мигрировать в Django я получаю следующее сообщение об ошибке:Ошибка целостности Django Postgres

django.db.utils.ProgrammingError: multiple default values specified for column "id" of table "location" 

Код для формирования таблицы выглядит следующим образом:

from django.contrib.gis.db import models 

class Article(models.Model): 
    article_id = models.AutoField(primary_key=True) 
    article_title = models.CharField(max_length=200, unique_for_date="pub_date") 
    pub_date = models.DateTimeField('date published') 
    article_summary = models.TextField() 
    title_id = models.CharField(max_length=200) 
    section_id = models.CharField(max_length=200) 

    def __unicode__(self): 
     return u'%s %s' % (self.article_title, self.pub_date)   
    class Meta: 
     db_table = 'article' 


class Author(models.Model): 
    author_id = models.AutoField(primary_key=True) 
    articles = models.ManyToManyField(Article) 
    first_name = models.CharField(max_length=200) 
    last_name = models.CharField(max_length=200) 

    def __unicode__(self): 
     return u'%s %s %s' % (self.articles, self.first_name, self.last_name) 

    class Meta: 
     db_table = 'author' 

class Location(models.Model): 
    location_id = models.AutoField(primary_key=True) 
    lat = models.FloatField() 
    lon = models.FloatField() 
    local = models.CharField(max_length=200) 
    city = models.CharField(max_length=200) 
    region = models.CharField(max_length=200) 
    country = models.CharField(max_length=200) 
    continent = models.CharField(max_length=200) 
    article = models.ForeignKey(Article, default=0) 

    def __unicode__(self): 
     return u'%s %s %s' % (self.location_id, self.lat, self.lon) 

    class Meta: 
     db_table = 'location' 

Я предполагаю, что это что-то относительно простой, но это ускользало от меня в течение последних нескольких дней. Дайте мне знать, если вам нужна дополнительная информация.

Это код модели я теперь я использую, но все еще с той же проблемой описанной выше:

from django.contrib.gis.db import models 

class Author(models.Model): 
    first_name = models.CharField(max_length=200) 
    last_name = models.CharField(max_length=200) 

    def __unicode__(self): 
     return u'%s %s' % (self.first_name, self.last_name)   
    class Meta: 
     db_table = 'author' 


class Location(models.Model): 
    lat = models.FloatField() 
    lon = models.FloatField() 
    local = models.CharField(max_length=200) 
    city = models.CharField(max_length=200) 
    region = models.CharField(max_length=200) 
    country = models.CharField(max_length=200) 
    continent = models.CharField(max_length=200) 

    def __unicode__(self): 
     return u'%s %s' % (self.lat, self.lon)  
    class Meta: 
     db_table = 'location' 


class Article(models.Model): 
    authors = models.ManyToManyField(Author) 
    location = models.ForeignKey(Location) 
    article_title = models.CharField(max_length=200, unique_for_date="pub_date") 
    pub_date = models.DateTimeField('date published') 
    article_summary = models.TextField() 
    title_id = models.CharField(max_length=200) 
    section_id = models.CharField(max_length=200) 

    def __unicode__(self): 
     return u'%s %s' % (self.article_title, self.pub_date)   
    class Meta: 
     db_table = 'article' 
+1

Почему вы назначаете location_id, article_id и т. Д.? django автоматически присваивает идентификатор каждой модели –

+0

Но 'id', кажется, присутствует в БД. Вы выполняли миграцию БД? –

+0

Я иду из sql-фона и не привык к тому, чтобы не определять вещи явно! лучше ваш путь, хотя! – sammy88888888

ответ

1

Если статья может иметь много авторов, и в одном месте, то, что вам нужно, это много-к -Много отношения с автором и внешним ключом с расположением.

class Article(models.Model): 
    article_id = models.AutoField(primary_key=True) 
    authors = models.ManytoManyField(Author) 
    location = models.ForeignKey(Location) 
    article_title = models.CharField(max_length=200, unique_for_date="pub_date") 
    pub_date = models.DateTimeField('date published') 
    article_summary = models.TextField() 
    title_id = models.CharField(max_length=200) 
    section_id = models.CharField(max_length=200) 

Вам не нужен идентификатор статьи в месте нахождения.

class Location(models.Model): 
    location_id = models.AutoField(primary_key=True) 
    lat = models.FloatField() 
    lon = models.FloatField() 
    local = models.CharField(max_length=200) 
    city = models.CharField(max_length=200) 
    region = models.CharField(max_length=200) 
    country = models.CharField(max_length=200) 
    continent = models.CharField(max_length=200) 

Стоит также отметить, что вы не должны создать идентификатор для вашей модели (они создаются автоматически), если вы не хотите использовать что-то другое, чем простые целые числа для модели идентификаторов.

+0

Отлично, спасибо за ответ. Я удалил идентификатор для каждой модели и выполнил миграцию по вашему предложению, но теперь я получаю «NameError: name« Author »не определен». Это что-то делать с порядком создания таблиц? Приветствия – sammy88888888

+0

Привет @ sammy88888888, вы правы. Порядок имеет решающее значение, если модель автора еще не создана, ForeignKey в «Article» должен быть указан как: 'authors = models.ManytoManyField (« Автор »)'. Или вы можете просто переместить определение модели «Автор» до определения модели «Article». – slackmart

+0

Итак, решение выше работает, но теперь я снова испытываю ту же проблему при выполнении миграции: 'django.db.utils.ProgrammingError: несколько значений по умолчанию, заданных для столбца« id »таблицы« location ». Я обновил код модели выше. – sammy88888888

Смежные вопросы