django數據模型中關於on_delete, db_constraint的使用


一、外鍵的刪除

關於on_delete的總結

  • 1、常見的使用方式(設置為null)

    class BookModel(models.Model):
        """ 書籍表 """
        book_name = models.CharField(max_length=100, verbose_name='書名')
        # 表示外鍵關聯到作者表,當作者表刪除了該條數據,圖書表中不刪除,僅僅是把外鍵置空
        author = models.ForeignKey(AuthModel, null=True, blank=True, on_delete=models.SET_NULL)
        price = models.FloatField(verbose_name='價格')
        create_time = models.DateTimeField(auto_now_add=True, verbose_name='添加時間')
  • 2、關於別的屬性的介紹

    • CASCADE:這就是默認的選項,級聯刪除,你無需顯性指定它。
    • PROTECT: 保護模式,如果采用該選項,刪除的時候,會拋出ProtectedError錯誤。
    • SET_NULL: 置空模式,刪除的時候,外鍵字段被設置為空,前提就是blank=True, null=True,定義該字段的時候,允許為空。
    • SET_DEFAULT: 置默認值,刪除的時候,外鍵字段設置為默認值,所以定義外鍵的時候注意加上一個默認值。
    • SET(): 自定義一個值,該值當然只能是對應的實體了
  • 3、補充說明:關於SET()的使用

    **官方案例**
    def get_sentinel_user():
        return get_user_model().objects.get_or_create(username='deleted')[0]
    
    class MyModel(models.Model):
        user = models.ForeignKey(
            settings.AUTH_USER_MODEL,
            on_delete=models.SET(get_sentinel_user),
        )

 

ManyToMany參數(through,db_constraint)

 

 

through : 指定自己寫好的第三張表,我們可以給第三張表添加字段了(告訴Django不用建第三張表了,我們都給他配好了)

復制代碼
class Book(models.Model):
    name=models.CharField(max_length=20)
    authors=models.ManyToMany('Author',through='Score')


class Author(models.Model):
    name=models.CharField(max_length=20)


class Score(models.Model):
    book=models.ForeignKey('Book')
    author=models.ForeignKey('Author')
    socre=models.IntegerField()
復制代碼

如果只寫manytomany,那么第三張是Django替我們建的,可以通過book.authors字段進行一系列操作(add(增),all(查),set(重置),remove(刪除)),但是此時沒法給第三張表加其他我們需要的字段,

而如果不寫,ManyToMany字段,那么我們可以通過Score來執行一些操作,但是此時book和author表已經沒有直接的聯系了,查詢起來很繁瑣

有了authors=models.ManyToMany('Author',through='Score'),那么就既可以方便查,也方便業務,添加需要的字段

 

db_constraint : 

db_constraint=False,這個就是保留跨表查詢的便利(雙下划線跨表查詢```),但是不用約束字段了,一半公司都用false,這樣就省的報錯,因為沒有了約束(Field字段對象,既約束,又建立表與表之間的關系)


limit_choices_to
限制關聯字段的對象范圍


related_name
反向查詢字段可以不用 表名小寫,可以改名了

db_table
第三張表的名字

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM