Измените идентификатор 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'

очень легко...

Вернуться на верх