Как передать значение поля из одной модели Django в поле другой модели через связь OneToOneField?

Рейтинг: 0Ответов: 1Опубликовано: 11.05.2023

Хочу взять дату рождения из модели Students и передать в Passport. Но сколько бы не старался при создании нового паспорта для студента через админ панель, открывается окно создания паспорта, и при выборе определенного студента дата рождения не передаётся в Date of birth и остается пустым. Как это исправить?

models.py:

from django.db import models
from django.db.models.signals import post_save
from django.dispatch import receiver
from datetime import date

class Student(models.Model):
    studentId = models.AutoField(primary_key=True)
    Firstname = models.CharField(max_length=100)
    Lastname = models.CharField(max_length=100)
    Phone = models.CharField(max_length=20)
    Email = models.EmailField()
    Date_birth = models.DateField()

    def __str__(self):
        return f'{self.Firstname} {self.Lastname}'

class Passport(models.Model):
    GENDER_CHOICES = (
        ('M', 'Male'),
        ('F', 'Female'),
        ('O', 'Other')
    )

    student = models.OneToOneField(Student, on_delete=models.CASCADE)
    passport_number = models.CharField(max_length=20)
    issued_by = models.CharField(max_length=100)
    expiration_date = models.DateField(default=date.today)
    gender = models.CharField(max_length=10, choices=GENDER_CHOICES, default='M')
    place_of_birth = models.CharField(max_length=100, blank=True, null=True)
    date_of_birth = models.DateField()

    def __str__(self):
        return f'Passport: {self.passport_number}'

@receiver(post_save, sender=Student)
def create_passport(sender, instance, created, **kwargs):
    if created:
        Passport.objects.create(
            student=instance,
            place_of_birth=instance.Date_birth.strftime('%Y-%m-%d'),
            date_of_birth=instance.Date_birth
        )
@receiver(post_save, sender=Student)
def create_or_update_passport(sender, instance, created, **kwargs):
    if created:
        Passport.objects.filter(student=instance).delete()
        Passport.objects.create(
            student=instance,
            place_of_birth=instance.Date_birth.strftime('%Y-%m-%d'),
            date_of_birth=instance.Date_birth
        )

admin.py:

from django.contrib import admin
from .models import Student, Passport

class StudentAdmin(admin.ModelAdmin):
    list_display = ('Firstname', 'Lastname', 'Phone', 'Email', 'Date_birth')

class PassportAdmin(admin.ModelAdmin):
    list_display = ('passport_number', 'issued_by', 'expiration_date', 'date_of_birth')  # Добавлено поле 'date_of_birth'

admin.site.register(Student, StudentAdmin)
admin.site.register(Passport, PassportAdmin)

Мне нужно, чтобы значение поля Date_birth из модели Student автоматически передавалось в поле date_of_birth модели Passport при создании паспорта для выбранного студента (все тесты проводились через admin-панель django). Как можно достичь этого?

Ответы

▲ 0

При работе с моделью Passport не проще ли через студента получить все данные?

some_passport = Passport.objects.first()

some_passport.student.Date_birth # Возвращает данные из поля Date_birth из связанной модели Student

Если нужно и паспорт и студента выводить вместе в админке - почитайте про Inline в Django admin, в интернетах мануалов по такому "склеиванию" масса.