2013-05-11 3 views
1

Я добавил классы в модель приложения Django для создания таблиц mysql. У меня есть таблица «загрузок» и столбец «загрузки» в таблице «песни».Django mysql имя таблицы не подтвердило

Когда я хочу, чтобы синхронизировать БД, Джанго возвращает мне ошибку:

CommandError: One or more models did not validate: 
mp3mid.downloads: Reverse query name for field 'song' clashes with field 'songs.downloads'. Add a related_name argument to the definition for 'song'. 

Почему это невозможно дать одно имя таблицы и столбца?

это мой models.py:

from django_evolution.mutations import * 
from django.db import models 

class singers(models.Model): 
    name = models.CharField(max_length = 255) 
    category = models.ForeignKey(categories) 

class songs(models.Model): 
    name = models.CharField(max_length = 255) 
    singer = models.ForeignKey(singers) 
    downloads = models.IntegerField(max_length = 11) 
    exclusive = models.BooleanField(default = 0) 
    hit = models.BooleanField(default = 0) 
    date = models.DateTimeField(auto_now_add = True) 
    link = models.CharField(max_length = 255) 

class downloads(models.Model): 
    song = models.ForeignKey(songs) 
    date = models.DateTimeField(auto_now_add = True) 
+1

вы можете разместить свои модели классов – dm03514

+1

что об этом http://stackoverflow.com/questions/2608017/django-syncdb-error-one-or-more-models-did-not-validate?rq=1 – darxsys

+0

@ dm03514 добавил файл models.py. –

ответ

1

Django позволяет make queries that span relationships.

В вашем случае, внешний ключ от downloads к songs означает, что вы могли бы, как правило, делать запросы, которые следуют отношениям назад от песни к загрузке:

from datetime import datetime 
# fetch all songs with a download with a date on or after 2013-05-01. 
songs = song.objects.filter(downloads__date__gte=datetime(2013,5,1)) 

Однако, вы не можете сделать это в этом случае, потому что downloads столкновений с вашим полем songs.downloads.

У вас есть несколько вариантов. Во-первых, вы можете установить related_name для вашего внешнего ключа, как указано в сообщении об ошибке.

class downloads(models.Model): 
    song = models.ForeignKey(songs, related_name="related_downloads") 

Или вы можете переименовать свое поле song.downloads.

class songs(models.Model): 
    ... 
    num_downloads = models.IntegerField(max_length = 11) 

Как в стороне, я рекомендую вам переименовать свои модели в Singer, Song и Download (капитализируется, единственное число вместо множественного числа), следовать соглашению Джанго.

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