Django 当试图内联模型时,Django 没有对的外键
在本文中,我们将介绍在Django中使用内联模型时,可能会遇到的错误提示:“Django
阅读更多:Django 教程
问题描述
在使用Django的Admin后台管理系统时,我们可能需要在一个模型的编辑页面中内联显示其他相关的模型。为了实现这个功能,我们可以在Admin中使用InlineModelAdmin
类来定义内联模型。
然而,当我们尝试使用内联模型时,有时候会遇到一个错误提示:“Django
解决方法
要解决这个错误,我们需要在内联模型的定义中指定正确的外键关系。下面是几种常见的情况以及对应的解决方法。
情况一:模型之间没有直接的外键关系
当两个模型之间没有直接的外键关系时,我们需要使用ForeignKey
或OneToOneField
字段在其中一个模型中创建一个外键来建立关联。
例如,我们有两个模型Author
和Book
,它们之间没有直接的外键关系。为了在Author
的编辑页面中内联显示Book
,我们可以在Book
模型中添加一个外键指向Author
:
class Author(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
author = models.ForeignKey(Author, on_delete=models.CASCADE)
title = models.CharField(max_length=100)
接下来,我们可以通过在AuthorAdmin
中使用InlineModelAdmin
将Book
模型内联显示在Author
的编辑页面中:
class BookInline(admin.StackedInline):
model = Book
class AuthorAdmin(admin.ModelAdmin):
inlines = [BookInline]
admin.site.register(Author, AuthorAdmin)
现在,在Author
的编辑页面中,我们可以看到一个内联的Book
表单来关联该作者的书籍。
情况二:模型之间存在多对多关系
当两个模型之间存在多对多关系时,我们需要使用ManyToManyField
字段来创建中间模型,并在内联模型中关联这个中间模型。
例如,我们有两个模型Product
和Category
,它们之间存在多对多的关系。为了在Category
的编辑页面中内联显示与之关联的Product
,我们可以创建一个中间模型ProductCategory
来建立关联:
class Product(models.Model):
name = models.CharField(max_length=100)
class Category(models.Model):
name = models.CharField(max_length=100)
products = models.ManyToManyField(Product, through='ProductCategory')
class ProductCategory(models.Model):
product = models.ForeignKey(Product, on_delete=models.CASCADE)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
extra_field = models.CharField(max_length=100)
接下来,在CategoryAdmin
中使用InlineModelAdmin
将ProductCategory
模型内联显示在Category
的编辑页面中:
class ProductCategoryInline(admin.TabularInline):
model = ProductCategory
class CategoryAdmin(admin.ModelAdmin):
inlines = [ProductCategoryInline]
admin.site.register(Category, CategoryAdmin)
现在,在Category
的编辑页面中,我们可以看到一个内联的ProductCategory
表单来关联该分类的产品,并可以添加额外的字段。
情况三:使用through
参数指定中间模型
当我们在内联模型中使用through
参数指定了中间模型时,需要注意中间模型是否正确地定义了外键关系。
例如,我们有三个模型User
、Group
和Membership
,它们之间存在多对多的关系。为了在Group
的编辑页面中内联显示与之关联的User
,我们需要使用中间模型Membership
并指定外键关系:
class User(models.Model):
name = models.CharField(max_length=100)
class Group(models.Model):
name = models.CharField(max_length=100)
members = models.ManyToManyField(User, through='Membership')
class Membership(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
group = models.ForeignKey(Group, on_delete=models.CASCADE)
extra_field = models.CharField(max_length=100)
接下来,在GroupAdmin
中使用InlineModelAdmin
将Membership
模型内联显示在Group
的编辑页面中:
class MembershipInline(admin.TabularInline):
model = Membership
class GroupAdmin(admin.ModelAdmin):
inlines = [MembershipInline]
admin.site.register(Group, GroupAdmin)
现在,在Group
的编辑页面中,我们可以看到一个内联的Membership
表单来关联该组的成员,并可以添加额外的字段。
总结
在本文中,我们解决了Django中使用内联模型时可能遇到的错误提示:“Django