簡體   English   中英

將 foreignKey id 更改為另一個 Field

[英]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.

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