Django配置产品图片一对多模型时TabularInline报无外键错误
问题排查与解决方法
你遇到的问题由两处核心配置错误导致,按以下步骤修改即可解决:
1. 修正一对多外键的关联方向
你的需求是1个产品对应多张图片,一对多关系的外键必须定义在多的一方(Image模型),指向一的一方(Product模型)。你当前把外键写在Product模型中,逻辑完全颠倒,也不符合后续后台内嵌配置的要求。
修改models.py代码如下:
from django.db import models from django.db.models.fields import CharField class Product(models.Model): productName = models.CharField(max_length=200) productDescription = models.TextField(blank=True) productPrice = models.DecimalField(max_digits=9, decimal_places=0, default=0) productAvailable = models.BooleanField(default = True) productCreated_at = models.DateTimeField(auto_now_add = True) productUpdated_at = models.DateTimeField(auto_now = True) productSlug = models.SlugField(max_length = 255, unique = True, help_text = "Unique text for url created from product name") productMetaKeywords = models.CharField("Meta keywords for SEO", max_length = 255, help_text ="Comma delimited words for SEO") productMetaDescription = models.CharField("Meta description", max_length = 255, help_text="Content for meta tag description") class Meta: db_table = 'products' ordering = ['-productName'] def __str__(self): return self.productName class Image(models.Model): # 新增外键关联Product,related_name用于从Product侧反向调用关联的图片 product = models.ForeignKey(Product, related_name="productImages", on_delete=models.CASCADE) image = models.ImageField() imageMetaKeyWords = models.CharField("Meta keywords for SEO", max_length = 255, help_text = "Comma delimited words for SEO") imageMetaDescription = models.CharField("Meta description", max_length = 255, help_text = "Content for image meta tag description") defaultImage = models.BooleanField(default= False)
2. 修正Admin后台的Inline配置
你定义的ImageTabularInline是要在Product的编辑页面内嵌图片的编辑项,因此inline的model参数必须填写Image而不是Product,你之前的配置会让Django误以为你要在Product页内嵌Product自身的表单,自然会要求Product有指向自身的外键,就触发了admin.E202报错。
修改admin.py代码如下:
from django.contrib import admin from .models import Product, Image from .forms import ProductAdminForm class ImageTabularInline(admin.TabularInline): model = Image class ProductAdmin(admin.ModelAdmin): form = ProductAdminForm inlines = [ImageTabularInline,] class Meta: model = Product admin.site.register(Product, ProductAdmin) admin.site.register(Image)
后续操作
修改完成后执行以下命令即可正常生成迁移表:
python manage.py makemigrations python manage.py migrate
如果运行时提示缺少Pillow依赖,执行pip install pillow安装即可。
内容的提问来源于stack exchange,提问作者jxw
相关产品推荐
相关产品推荐

