[英]Change the foreignKey id to another Field
不知道有沒有這樣的邏輯,因為之前用C#和VB編程的時候看到過,但是在Django,好像很難搞定。
那我想要什么? 我希望數據庫中的表保存名稱而不是外鍵的 ID。 這是 model.py
from pyexpat import model
from statistics import mode
from venv import create
from django.db import models
from django.contrib.auth.models import User
from django.db.models.base import Model
from django.forms import IntegerField
class Post(models.Model):
name = models.CharField(max_length=150)
def __str__(self):
return str(self.name)
class Person(models.Model):
post = models.ForeignKey(Post , on_delete=models.CASCADE)
name = models.CharField(max_length=100, unique=True)
def __str__(self):
return f"({self.name} is {self.post})"
class Room(models.Model):
name = models.CharField(max_length= 150, unique = True)
def __str__(self):
return str(self.name)
class Classification(models.Model):
name = models.ForeignKey(Person, on_delete=models.CASCADE)
room = models.ForeignKey(Room, on_delete=models.CASCADE)
date = models.DateField(auto_created=False)
create_date = models.DateTimeField(auto_created=True)
def __str__(self):
return f"({self.name} Take {self.room} at {self.date})"
數據庫表中的結果:
我想在數據庫表中看到的是 Django 用名稱替換 name_id 列中的 id,用房間名稱替換 room_id
那可能嗎?
您可以使用to_field=…
參數[Django-doc]來指定ForeignKey
應該指向的內容。 這應該始終是目標 model 中的唯一字段。因此您可以使用:
class Classification(models.Model):
person = models.ForeignKey(Person, to_field='name', on_delete=models.CASCADE)
room = models.ForeignKey(Room, on_delete=models.CASCADE)
date = models.DateField()
create_date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f'({self.person_id} Take {self.room} at {self.date})'
但是,您可能應該為Classification
model 重新創建遷移,從而創建一個引用Person
name
ForeignKey
的外鍵。
這里可以使用self.person_id
來避免額外查詢加載Person
object,從而提高調用Classification
object的__str__
方法時的效率。
首先,您需要在 Model primary_key=True
中將名稱設為 Pk,然后在 ForeignKey 中設置to_field='name'
很簡單...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.