Как получить идентификатор внешнего ключа

Я пытаюсь автозаполнить эти поля, если выбран внешний ключ

Базовый класс:

class ScreeningCamp(models.Model):
    beneficiary=models.ForeignKey(Beneficiary,on_delete=models.CASCADE)
    name=models.CharField(max_length=200,default=Beneficiary.objects.get(id=beneficiary.id).name,blank=True)
    dob=models.DateField(default=Beneficiary.objects.get(id=beneficiary.id).dob,blank=True)
    gender=models.CharField(max_length=200,choices=GENDER_CHOICES,default=Beneficiary.objects.get(beneficiary.id).gender,blank=True)
    fatherName=models.CharField(max_length=200)
    motherName=models.CharField(max_length=200)
    careGiver=models.CharField(max_length=200,default=Beneficiary.objects.get(id=beneficiary.id).careGiversName,blank=True,null=True)
    relationship=models.CharField(max_length=200,choices=RELATIONSHIP_CHOICES,default=Beneficiary.objects.get(id=beneficiary.id).relationship,blank=True,null=True)
    address=models.TextField(Beneficiary.objects.get(id=beneficiary.id).address,blank=True,null=True)
    village=models.CharField(max_length=200,default=Beneficiary.objects.get(id=beneficiary.id).village,blank=True,null=True)
    phone=models.CharField(max_length=13,blank=True,null=True,default=Beneficiary.objects.get(id=beneficiary.id).phone,)
    designation=models.CharField(max_length=200,choices=DESIGNATION_CHOICES,default=Beneficiary.objects.get(id=beneficiary.id).designation,blank=True,null=True)
    disability=models.CharField(max_length=200,choices=DISABILITY_CHOICES)
    visitedBy=models.CharField(max_length=200)
    def __str__(self):
        return self.name

Родительский класс:

class Beneficiary(models.Model):
    image=models.ImageField(upload_to='home/images/',blank=True,null=True)
    name = models.CharField(max_length=200)
    gender=models.CharField(max_length=6,choices=GENDER_CHOICES,default='male')
    dob=models.DateField()
    registrationDate=models.DateField()
    uidOrAadhaar=models.CharField(blank=True,max_length=12,null=True)
    careGiversName=models.CharField(max_length=200,blank=True,null=True)
    reletionship=models.CharField(max_length=200,choices=RELATIONSHIP_CHOICES,default='other',blank=True,null=True)
    beneficiaryType=models.CharField(max_length=200,choices=BENIFICIARY_TYPE_CHOICES,default='active')
    statusOfBeneficiary=models.CharField(max_length=200,choices=STATUS_OF_BENIFICIARY_CHOICES,default='red')
    address=models.TextField(blank=True,null=True)
    district=models.CharField(max_length=200,blank=True,null=True)
    city=models.CharField(max_length=200)
    pinCode=models.CharField(max_length=200,blank=True,null=True)
    addressType=models.CharField(max_length=200,choices=ADDRESS_TYPE_CHOICES,blank=True,null=True)
    phone=models.CharField(max_length=13,blank=True,null=True)
    email=models.EmailField(blank=True,null=True)
    diagonisis=models.CharField(max_length=200,choices=DIAGONISIS_CHOICES)
    diagnosedBy=models.CharField(max_length=200,choices=DIAGNOSED_BY_CHOICES,default="")
    informedBy=models.CharField(max_length=200,default='')
    designation=models.CharField(max_length=200,choices=DESIGNATION_CHOICES,default="")
    symptomsAsInformed=models.TextField(blank=True,null=True)
    educationHistory=models.CharField(max_length=200,choices=EDUCATION_HISTORY_CHOICES)

    maritialStatus=models.CharField(max_length=200,choices=MARTIAL_STATUS_CHOICES,blank=True,null=True)
    occupation=models.CharField(max_length=200,blank=True,null=True)
    skill=models.CharField(max_length=200,blank=True,null=True)
    birth=models.CharField(max_length=200,choices=BIRTH_CHOICES,blank=True,null=True)
    durationOfIllness=models.CharField(max_length=200,choices=DURATION_OF_ILLNESS_CHOICES,blank=True,null=True)
    pastPyschiatricIllness=models.CharField(max_length=200,choices=PAST_PYSCHIATRIC_ILLNESS_CHOICES,blank=True,null=True)
    gp=models.CharField(max_length=200)
    village=models.CharField(max_length=200)
    family_history_of_MI_present_or_absent=models.BooleanField(default=False)
    if_present_schizophrenia_or_mania_or_depression=models.BooleanField(default=False)
    def __str__(self):
        return self.name
    class Meta:
        verbose_name_plural = "Beneficiaries"

Я просто хочу автозаполнять имя, дату и т.д. из класса бенефициара, когда выбран внешний ключ

Когда он не выбран, мы должны сделать это вручную

Думаю, простое получение id выбранного объекта поможет

Может ли кто-нибудь сказать мне, как это сделать?

По сути, вы хотите создать запись ScreeningCamp с данными, которые используются при создании записи Beneficiary.

Пример: возьмем только поля name и dob.

beneficiary_1 = Beneficary(name='test1',dob=2006-10-02)

тогда в таблице ScreeningCamp будет создана строка с тем же именем, dob и отношением внешнего ключа к beneficary_1.

Вы можете достичь этого, используя сигналы Django.

models.py Давайте пока возьмем только имя и дату рождения.

Модели на models.py

class Beneficiary(models.Model):
    name = models.CharField(max_length=200)
    dob = models.DateField()


class ScreeningCamp(models.Model):
    beneficiary = models.ForeignKey(Beneficiary, on_delete=models.CASCADE)
    name = models.CharField(max_length=200, blank=True)
    dob = models.DateField(blank=True)

Предполагается, что модели объявлены в файле models.py того же приложения. Создайте файл signals.py в приложении, которое получает сигнал post_save при создании записи Beneficiary. Назовем приложение Post.

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


@receiver(post_save, sender=models.Beneficiary)
def create_screening_camp(sender, instance, created, **kwargs):
    if not created:
        return
        # Create the ScreeningCamp object, only if it is newly created
    screening_camp = models.ScreeningCamp(name=instance.name, beneficiary=instance, dob=instance.dob)
    screening_camp.save()

на вашем apps.py


from django.apps import AppConfig


class PostConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'Post'

    def ready(self):
        from . import signals

в settings.py installed_apps, include

INSTALLED_APPS = [
    ...
    'Post.apps.PostConfig',
]

Если вы вызываете ScreeningCamp, Django может искать Foreignkey. Вот пример:

screening_camp = ScreeningCamp.objects.get(pk=1)
name = screening_camp.beneficiary.name
gender = screening_camp.beneficiary.gender
dob = screening_camp.beneficiary.dob
# populating form
form = ScreeningCampForm(initial={"name": name, "gender": gender, "dob":dob}, instance=screening_camp)
return render(request, "form.html", {"form": form})
Вернуться на верх