django - Django模型只允许一次
问题描述
请原谅标题,但我不确定如何用语言表达。我有一个模型“卡”和一个模型“计算机”:
class card(models.Model):
name=models.CharField(
verbose_name = 'Name',
max_length=50,
null=True,
blank=True,
)
serial=models.CharField(
verbose_name = 'Serial',
max_length=50,
null=True,
blank=True,
)
class computer(models.Model):
name=models.CharField(
verbose_name = 'Name',
max_length=50,
null=True,
blank=True,
)
slot1 = models.OneToOneField(
'card',
related_name='cardslot1',
on_delete=models.SET_NULL,
null=True,
blank=True,
verbose_name = 'Slot 1',
)
slot2 = models.OneToOneField(
'card',
related_name='cardslot2',
on_delete=models.SET_NULL,
null=True,
blank=True,
verbose_name = 'Slot 2',
)
(当然这个电脑型号是无效的)这些卡是独一无二的,应该只允许在一个插槽中使用 - 任何电脑。实现这一目标的最佳方法是什么?我在考虑一个中间表,比如
卡n-1卡计算机n-1计算机
但我希望有更好的方法我现在还没有看到。谢谢
解决方案
为您的模型使用约束元选项。
from django.db import models
from django.db.models import CheckConstraint, Q
class computer(models.Model)
name=models.CharField(
verbose_name = 'Name',
max_length=50,
null=True,
blank=True,
)
slot1 = models.OneToOneField(
'card',
related_name='cardslot1',
on_delete=models.SET_NULL,
null=True,
blank=True,
verbose_name = 'Slot 1',
)
slot2 = models.OneToOneField(
'card',
related_name='cardslot2',
on_delete=models.SET_NULL,
null=True,
blank=True,
verbose_name = 'Slot 2',
)
class Meta:
constraints = [
CheckConstraint(
check = ~Q(slot1=slot2),
name = 'unique_slot',
),
]
推荐阅读
- mysql - GROUP_CONCAT 中的 MySQL COUNT
- apache-spark - Spark结构化流错误读取字段'topic_metadata'时出错
- microsoft-graph-api - 访问邮箱大小列表 - Exchange Online / Office 365
- javascript - Reduce() 已经被缩减的元素的对象
- php - 将 Wordpress 博客绑定到单个网站登录会话中,因此在菜单中选择博客时需要登录
- c# - Unity接地状态闪烁的字符。.isGrounded 正在使用但仍在闪烁
- ruby-on-rails - 如何设置基本的 Rails 模型关联?
- c++ - 使用奇怪重复模板模式时如何实例化基类?
- php - 未发布使用 php foreach 生成的第一行的值
- javascript - navigator.mediaDevices.getDisplayMedia 不支持