Skip to main content
 首页 » 编程设计

python之Django之class> 没有外键

2024年10月24日30davidwang456

我正在设置 Django 管理员:

模型.py

class Types(models.Model): 
    types = models.CharField(max_length=60) 
 
    def __str__(self): 
        return self.type 
 
class File(models.Model): 
    file_name = models.CharField(max_length=60) 
    type = models.ForeignKey(Types) 
 
    def __str__(self): 
        return self.file_name 
 
class Set(models.Model): 
    set_name = models.CharField(default='New Set', max_length=60) 
    data = models.DateTimeField('Date of creation') 
    file = models.ForeignKey(File) 
    size = models.IntegerField(default=0) 
 
    def __str__(self): 
        return ("%s - %s" % (self.set_name, str(self.data))) 
 
    class Meta: 
        ordering = ["data"] 

并且在 admin.py

class FileInline(admin.StackedInline): 
    model = File 
    extra = 2 
 
class SetAdmin(admin.ModelAdmin): 
    fieldsets = [ 
        (None,      {'fields':['set_name']}), 
        (None,      {'fields':['data']}), 
        (None,      {'fields':['size']}), 
    ] 
    inlines = [FileInline] 
 
admin.site.register(Set, SetAdmin) 

有了这个,我得到了以下错误:

(admin.E202) 'Disk.File' has no ForeignKey to 'Disk.Set'

根据 https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey 中的文档它应该工作。

我做了一些测试:https://docs.djangoproject.com/en/dev/ref/contrib/admin/#working-with-a-model-with-two-or-more-foreign-keys-to-the-same-parent-model但没有成功。反转类,使用 Set 中的 ForeignKey 创建 File 也没有用。

在 Django 教程中,我已经成功地建立了这种关系,但我无法复制它。

我检查了以下帖子的建议: Inline in Django admin: has no ForeignKey和 Django - Inline (has no ForeignKey to)但我不知道出了什么问题。

我正在使用 Python 2.7.6、Django 1.8.4、MySQL 5.6 和 Ubuntu 14.04。

如果有任何建议,我将不胜感激!

请您参考如下方法:

修剪你的代码问题是这样的 - 在你的模型中你说:

A Set has one File, and a File has many Sets

但是你的管理文件说:

A Set can have many Files

这是两个相互矛盾的说法。您需要让它们匹配,要么:

修复你的模型:

class File(models.Model): 
    # Add the below line 
    file = models.ForeignKey(Set)  
 
class Set(models.Model): 
    # Delete this line 
    # file = models.ForeignKey(File) 

或者修复您的管理员 - 这是一个完整的重写,上面似乎是您想要的。