python - 如何解决“模型用作中间模型但它没有模型的外键”?
问题描述
错误信息:
blogs.Permission: (fields.E336) The model is used as an intermediate model by 'blogs.Category.permission', but it does not have a foreign key to 'Category' or 'Permission'.
我试图在权限模型下将外键添加到“类别”,但仍然出现相同的错误。
模型.py:
from django.db import models
class Category(models.Model):
name = models.CharField(max_length=50)
permission = models.ManyToManyField('Permission',
related_name='category_permissions',
through='Permission'
)
def __str__(self):
return self.name
class Permission(models.Model):
HIGH = 'High'
MEDIUM = 'Medium'
LOW = 'Low'
CLASSIFICATION_CHOICES = [
(HIGH, 'High'),
(MEDIUM, 'Medium'),
(LOW, 'Low')
]
category_name = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='category_name')
name = models.CharField(max_length=100)
description = models.TextField()
platform = models.CharField(
max_length=10,
choices=PLATFORM_CHOICES,
default=BOTH,
)
classification = models.CharField(
max_length=10,
choices=CLASSIFICATION_CHOICES,
default=LOW,
)
def __str__(self):
return self.name
class MobileApp(models.Model):
name = models.CharField(max_length=200)
icon = models.ImageField(upload_to='app_icons', blank=True, null=True)
platform = models.CharField(
max_length=10,
choices=PLATFORM_CHOICES,
default=IOS,
)
category = models.ManyToManyField('Category')
provider = models.CharField(max_length=200)
identifier = models.CharField(max_length=200)
permission = models.ManyToManyField(Permission,
related_name='mobile_app_permission',
)
def __str__(self):
return self.name
我正在尝试使用“通过”参数来包含 MobileApp 和类别的权限 m2m 的描述字段
解决方案
这是各种破碎。
显然你希望你的多对多在 Category 和 MobileApp 之间,通过模型作为 Permission。所以 m2m 字段需要声明:
class Category(models.Model):
name = models.CharField(max_length=50)
permission = models.ManyToManyField('MobileApp',
related_name='category_permissions',
through='Permission'
)
其次,正如错误所述,在直通模型中,双方都需要外键。另外,您需要为他们提供合理的名称和相关名称。所以:
class Permission(models.Model):
category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='permissions')
mobile_app = models.ForeignKey('MobileApp', on_delete=models.CASCADE, related_name='permissions')
最后,您不需要在 Permission或Category的另一个方向上定义 m2ms 。从 MobileApp 中删除category
和字段。permission
推荐阅读
- powershell - 注册表中 Toast 通知按钮的自定义 URL
- javascript - 如何将 javascript new Date().getTimezoneOffset() 的结果转移到 C# 后端?
- python - Python - 保留 excel 数据透视表
- android - 当我尝试拍照时,相机不断停止(Android Studio)
- artifactory - 使用 JFrog CLI 删除工件会给出“200 OK”,但不会删除工件
- python - 如何为 wxPython(例如 wxMSW)使用平台特定的“端口”?
- jenkins - Jenkins - 将 withCredentials 翻译成声明式语法
- angular - 如何使用 pdf.js 输出转换文件并将其发送到后端
- jmeter - 带有 Jmeter 的 Graphql
- javascript - 如何访问本地存储中某些元素的键?