Измените идентификатор foreignKey на другое поле
Я не знаю, есть ли логика для этого, потому что я видел это раньше, когда программировал на C# и VB, но в Django, кажется, трудно получить это.
Итак, что я хочу? Я хочу, чтобы таблица в базе данных сохраняла имя, а не id foreignKey. А это 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 заменяет id в колонке name_id на имена, а room_id на названия комнат
возможно ли это?
Спасибо
Вы можете использовать параметр to_field=…
[Django-doc], чтобы указать, на что должен указывать ForeignKey
. Это должно всегда быть уникальное поле в модели таргетинга. Поэтому вы можете использовать:
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
модели, и таким образом позволить этому создать ForeignKey
, который ссылается на name
модели Person
.
Здесь можно использовать self.person_id
, чтобы избежать дополнительного запроса для загрузки объекта Person
. Это повысит эффективность при вызове метода __str__
объекта Classification
.
Сначала нужно сделать имя пк в модели primary_key=True
затем в ForeignKey установить значение to_field='name'
очень легко...