1. 程式人生 > >Django數據模型--表關系(一對多)

Django數據模型--表關系(一對多)

protected mage -a link play classes 進行 -i 返回

一、一對一關系

使用方法:models.ForeignKey(要關聯的模型)
舉例說明:年級、教師和學生

from django.db import models
class Grade(models.Model):
    name = models.CharField(max_length=)
class Student(models.Model):
    name = models.CharField(max_length=)
    grade = models.ForeignKey(Grade)
技術分享圖片

註意:外鍵定義在多方
參數:

ForeignKey(ForeignObject) # ForeignObject(RelatedField)
    to,                         # 要進行關聯的表名
    to_field=None,              # 要關聯的表中的字段名稱
    on_delete=None,             # 當刪除關聯表中的數據時,當前表與其關聯的行的行為
        - models.CASCADE,刪除關聯數據,與之關聯也刪除
        - models.DO_NOTHING,刪除關聯數據,引發錯誤IntegrityError
        - models.PROTECT,刪除關聯數據,引發錯誤ProtectedError
        - models.SET_NULL,刪除關聯數據,與之關聯的值設置為null(前提FK字段需要設置為可空)
        - models.SET_DEFAULT,刪除關聯數據,與之關聯的值設置為默認值(前提FK字段需要設置默認值)
        - models.SET,刪除關聯數據,
              a. 與之關聯的值設置為指定值,設置:models.SET(值)
              b. 與之關聯的值設置為可執行對象的返回值,設置:models.SET(可執行對象)
                 def func():
                     return 10
                 class MyModel(models.Model):
                     user = models.ForeignKey(
                         to="User",
                         to_field="id"
                         on_delete=models.SET(func),)
    related_name=None,          # 反向操作時,使用的字段名,用於代替 【表名_set】 如: obj.表名_set.all()
    related_query_name=None,    # 反向操作時,使用的連接前綴,用於替換【表名】     如: models.UserGroup.objects.filter(表名__字段名=1).values(‘表名__字段名‘)
    limit_choices_to=None,      # 在Admin或ModelForm中顯示關聯數據時,提供的條件:
        # 如:
        - limit_choices_to={‘nid__gt‘: 5}
        - limit_choices_to=lambda : {‘nid__gt‘: 5}

        from django.db.models import Q
        - limit_choices_to=Q(nid__gt=10)
        - limit_choices_to=Q(nid=8) | Q(nid__gt=10)
        - limit_choices_to=lambda : Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption=‘root‘)
    db_constraint=True          # 是否在數據庫中創建外鍵約束
    parent_link=False           # 在Admin中是否顯示關聯數據
技術分享圖片

調用方式:

student = Student()
grade = student.grade
技術分享圖片
grade = Grade()
students = grade.student_set.all()
技術分享圖片

Django數據模型--表關系(一對多)