1

我向 Django 应用程序模型添加了类以创建 mysql 表。我有“下载”表,“歌曲”表中有“下载”列。

当我想同步数据库时,Django 返回错误:

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)
4

1 回答 1

1

Django 允许您进行跨越关系的查询

在您的情况下,外键 from downloadstosongs意味着您通常可以进行查询,查询从歌曲到下载的关系:

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,SongDownload(大写,单数而不是复数),以遵循 Django 约定。

于 2013-05-12T15:05:36.603 回答