首页 > 解决方案 > 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计算机

但我希望有更好的方法我现在还没有看到。谢谢

标签: djangodjango-modelsrelationship

解决方案


为您的模型使用约束元选项。

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',
            ),
        ]

推荐阅读