IT Share you

외래 키 속성의 기본값 설정

shareyou 2021. 1. 8. 21:48
반응형

외래 키 속성의 기본값 설정


모델의 외래 키 필드에 대한 기본값을 설정하는 가장 좋은 방법은 무엇입니까? 학생이 exam_taken을 외래 키로 갖는 학생과 시험이라는 두 가지 모델이 있다고 가정합니다. 이상적으로 기본값을 설정하는 방법은 무엇입니까? 여기 내 노력의 기록이 있습니다.

class Student(models.Model):
   ....
   .....
   exam_taken = models.ForeignKey("Exam", default=1)

작동하지만 더 나은 방법이 있습니다.

def get_exam():
    return Exam.objects.get(id=1)

class Student(models.Model):
    ....
    .....
    exam_taken = models.ForeignKey("Exam", default=get_exam)

에서 여기에 동기화하는 동안,하지만 테이블 실패 오류가 존재하지 않습니다.

어떤 도움을 주시면 감사하겠습니다.


두 예 모두 기본 인스턴스의 ID를 하드 코딩하고 있습니다. 그것이 불가피하다면 저는 그냥 상수를 설정했습니다.

DEFAULT_EXAM_ID = 1
class Student(models.Model):
    ...
    exam_taken = models.ForeignKey("Exam", default=DEFAULT_EXAM_ID)

코드가 적고 상수 이름을 지정하면 더 읽기 쉽습니다.


더 자연스러운 접근 방식을 채택하기 위해 자연스러운 키를 사용합니다.

<app>/models.py

from django.db import models

class CountryManager(models.Manager):
    """Enable fixtures using self.sigla instead of `id`"""

    def get_by_natural_key(self, sigla):
        return self.get(sigla=sigla)

class Country(models.Model):
    objects = CountryManager()
    sigla   = models.CharField(max_length=5, unique=True)

    def __unicode__(self):
        return u'%s' % self.sigla

class City(models.Model):
    nome   = models.CharField(max_length=64, unique=True)
    nation = models.ForeignKey(Country, default='IT')

위의 @vault의 답변을 약간 수정합니다 (새로운 기능 일 수 있음). 자연 이름으로 필드를 참조하는 것이 확실히 바람직합니다. 그러나 Manager나는 재정의하는 대신 단순히 to_field매개 변수를 사용합니다 ForeignKey.

class Country(models.Model):
    sigla   = models.CharField(max_length=5, unique=True)

    def __unicode__(self):
        return u'%s' % self.sigla

class City(models.Model):
    nome   = models.CharField(max_length=64, unique=True)
    nation = models.ForeignKey(Country, to_field='sigla', default='IT')

제 경우 에는 관련 모델의 기존 인스턴스에 기본값을 설정하고 싶었습니다 . Examwith id 1가 삭제되었을 가능성이 있으므로 다음을 수행했습니다.

class Student(models.Model):
    exam_taken = models.ForeignKey("Exam", blank=True)

    def save(self, *args, **kwargs):
        try:
            self.exam_taken
        except:
            self.exam_taken = Exam.objects.first()
        super().save(*args, **kwargs)

exam_taken존재하지 않는 경우 django.db.models.fields.related_descriptors.RelatedObjectDoesNotExist액세스를 시도 할 때 발생합니다.


이 패턴을 사용할 수 있습니다.

class Other(models.Model):
    DEFAULT_PK=1
    name=models.CharField(max_length=1024)

class FooModel(models.Model):
    other=models.ForeignKey(Other, default=Other.DEFAULT_PK)

물론의 테이블에 행이 있는지 확인해야합니다 Other. 데이터 마이그레이션을 사용하여 존재하는지 확인해야합니다.

ReferenceURL : https://stackoverflow.com/questions/9311996/setting-default-value-for-foreign-key-attribute

반응형