1. 程式人生 > >058:表關係之一對一

058:表關係之一對一

表關係之一對一應用場景:

  比如一個使用者表和一個使用者資訊表。在實際網站中,可能需要儲存使用者的許多資訊,但是有些資訊是不經常用的。如果把所有資訊都存放到一張表中可能會影響查詢效率,因此可以把使用者的一些不常用的資訊存放到另外一張表中我們叫做UserInfo。但是使用者表User和使用者資訊表UserInfo就是典型的一對一了。

例項程式碼如下:

# models.py檔案內容:
class User(models.Model):
    username = models.CharField(max_length=100)

    def __str__(self):
        
return "<User: ID:%s, username:%s>" % (self.id, self.username) class UserInfo(models.Model): addr = models.CharField(max_length=200) user = models.OneToOneField("User", on_delete=models.CASCADE) def __str__(self): return "<UserInfo: ID:%s, addr:%s, user_id:%s>" % (self.id, self.addr, self.user.id
) # 注意這裡的資料庫中user_id的書寫格式 # views.py檔案內容:
def index(request): user = User.objects.first() # userinfo = UserInfo(addr="nanjing") # userinfo.user = user # userinfo.save() print(user.userinfo) # 通過User模型獲取UserInfo模型中的資料 return HttpResponse("success")

如果不想使用通過User模型獲取UserInfo模型中的資料,可以使用上節中的方式;例項程式碼如下:

# models.py檔案內容:
class User(models.Model):
    username = models.CharField(max_length=100)
    def __str__(self):
        return "<User: ID:%s, username:%s>" % (self.id, self.username)

class UserInfo(models.Model):
    addr = models.CharField(max_length=200)
    user = models.OneToOneField("User", on_delete=models.CASCADE, related_name="information")
    def __str__(self):
        return "<UserInfo: ID:%s, addr:%s, user_id:%s>" % (self.id, self.addr, self.user.id)

# views.py檔案內容:
def index(request):
    user = User.objects.first()
    # userinfo = UserInfo(addr="nanjing")
    # userinfo.user = user
    # userinfo.save()
    # print(user.userinfo)
    print(user.information)                 # 這裡的information和上面模型中的related_name="information"要對應
  return HttpResponse("success")