簡體   English   中英

外鍵 Django 模型

[英]Foreign Key Django Model

我正在嘗試創建 3 個模型; PersonAddressAnniversy 計划是為每個人設置一個地址和一個紀念日。 但是每個地址和紀念日可以有多個人。

到目前為止,我有以下內容,但我認為OneToMany(foreign key)關系可能是錯誤的。 即每個地址可以有一個人,但每個人可以有多個地址。

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=50)
    birthday = models.DateField()

    def __unicode__(self):
        return u'%s' % (self.name)

class Address(models.Model):
    person = models.ForeignKey(Person)
    address = models.CharField(max_length=150)

    def __unicode__(self):
        return u'%s' % (self.address)

class Anniversy(models.Model):
    person = models.ForeignKey(Person)
    anniversy = models.DateField()

    def __unicode__(self):
        return u'%s' % (self.anniversy)

您以相反的方式創建關系; 將外鍵添加到Person類型以創建多對一關系:

class Person(models.Model):
    name = models.CharField(max_length=50)
    birthday = models.DateField()
    anniversary = models.ForeignKey(
        "Anniversary", on_delete=models.CASCADE)
    address = models.ForeignKey(
        "Address", on_delete=models.CASCADE)

class Address(models.Model):
    line1 = models.CharField(max_length=150)
    line2 = models.CharField(max_length=150)
    postalcode = models.CharField(max_length=10)
    city = models.CharField(max_length=150)
    country = models.CharField(max_length=150)

class Anniversary(models.Model):
    date = models.DateField()

我為其他模型使用了字符串名稱,因此它們仍然可以在之后定義,或者您可以最后定義Person模型。

任何一個人只能連接到一個地址和一個周年紀念日,但地址和周年紀念日可以從多個Person條目中引用。

AnniversaryAddress對象也將被賦予反向、反向的關系; 默認情況下,它將被稱為person_set ,但如果需要,您可以配置不同的名稱。 請參閱查詢文檔中的“向后”關系

我建議,如果使用基於應用程序的方法來分離邏輯關注點,使用字符串模型引用來處理ForeignKey關系會稍微好一些。

因此,擴展 Martijn Pieters 的答案:

class Person(models.Model):
    name = models.CharField(max_length=50)
    birthday = models.DateField()
    anniversary = models.ForeignKey(
        'app_label.Anniversary', on_delete=models.CASCADE)
    address = models.ForeignKey(
        'app_label.Address', on_delete=models.CASCADE)

class Address(models.Model):
    line1 = models.CharField(max_length=150)
    line2 = models.CharField(max_length=150)
    postalcode = models.CharField(max_length=10)
    city = models.CharField(max_length=150)
    country = models.CharField(max_length=150)

class Anniversary(models.Model):
    date = models.DateField()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM