외래 키 속성의 기본값 설정
모델의 외래 키 필드에 대한 기본값을 설정하는 가장 좋은 방법은 무엇입니까? 학생이 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')
제 경우 에는 관련 모델의 기존 인스턴스에 기본값을 설정하고 싶었습니다 . Exam
with 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
'IT Share you' 카테고리의 다른 글
@ RolesAllowed-Annotation의 값 매개 변수로 Enum 형식 사용 (0) | 2021.01.08 |
---|---|
IE 호환 모드 : 'X-UA-Compatible'태그 'Edge' (0) | 2021.01.08 |
$의 차이? (0) | 2021.01.08 |
findFragmentById는 항상 null을 반환합니다. (0) | 2021.01.08 |
라우팅 앱 커버리지 파일 (0) | 2021.01.08 |