zoukankan      html  css  js  c++  java
  • django中的model 的unique_together(联合唯一)

    unique_together解释

    nique_together

    这个元数据是非常重要的一个!它等同于数据库的联合约束!

    举个例子,假设有一张用户表,保存有用户的姓名、出生日期、性别和籍贯等等信息。要求是所有的用户唯一不重复,可现在有好几个叫“张伟”的,如何区别它们呢?(不要和我说主键唯一,这里讨论的不是这个问题)

    我们可以设置不能有两个用户在同一个地方同一时刻出生并且都叫“张伟”,使用这种联合约束,保证数据库能不能重复添加用户(也不要和我谈小概率问题)。在Django的模型中,如何实现这种约束呢?

    使用unique_together,也就是联合唯一!

    比如:

    unique_together = (('name', 'birth_day', 'address'),)
    

    这样,哪怕有两个在同一天出生的张伟,但他们的籍贯不同,也就是两个不同的用户。一旦三者都相同,则会被Django拒绝创建。这一元数据经常被用在admin后台,并且强制应用于数据库层面。

    unique_together接收一个二维的元组((xx,xx,xx,...),(),(),()...),每一个元素都是一个元组,表示一组联合唯一约束,可以同时设置多组约束。为了方便,对于只有一组约束的情况下,可以简单地使用一维元素,例如:

    unique_together = ('name', 'birth_day', 'address')
    

    联合唯一无法作用于普通的多对多字段。

    例如我的表关系是:

    from django.db import models
    
    # Create your models here.
    from django.contrib.auth.models import  AbstractUser
    
    time_choices = (
        (1, '8:00'),
        (2, '9:00'),
        (3, '10:00'),
        (4, '11:00'),
        (5, '12:00'),
        (6, '13:00'),
        (7, '14:00'),
        (8, '15:00'),
        (9, '16:00'),
        (10, '17:00'),
        (11, '18:00'),
        (12, '19:00'),
        (13, '20:00'),
    )
    
    class UserInfo(AbstractUser):
        pass
    
    
    
    
    class Room(models.Model):
        """
        会议室表
        """
        caption = models.CharField(max_length=32)
        num = models.IntegerField()
        def __str__(self):
            return self.caption
    
    
    class Book(models.Model):
        """
        会议室预定信息
        """
        user = models.ForeignKey('UserInfo',on_delete=models.CASCADE)
        room = models.ForeignKey('Room',on_delete=models.CASCADE)
        date = models.DateField()
        time_id = models.IntegerField(choices=time_choices)
    
        class Meta:
            unique_together = (
                ('room','date','time_id'),  # 联合唯一
            )
    
        def __str__(self):
            return str(self.user)+"预定了"+str(self.room)

    参考:https://blog.csdn.net/qqizz/article/details/80020762

  • 相关阅读:
    GLASS产品下载
    Google earth engine批量下载MODIS数据并导出
    获取浏览器路径'?'开头,&开头的参数
    Js Vue全屏切换显示 指定div切换全屏显示
    关于Js 进一步应用遇到的小问题--总结
    自定义基于element UI 换行步骤条
    Vue 自定义封装树形表格组件
    js 解决在Vue中阻止重复提交、多次触发、节流函数、防止短时间多次触发问题
    Vue中使用 echarts 实现动态配置参数及类型显示不同形状的图表配置、可视化的echarts图表组件
    数据结构 -- 链表的整表创建
  • 原文地址:https://www.cnblogs.com/one-tom/p/12074025.html
Copyright © 2011-2022 走看看