2013-02-03 4 views
0

다른 장담할만한 Django 질문이 있습니다. 내 수업을위한 데이터베이스 응용 프로그램을 쓰고 있는데, 응용 프로그램 내에서 현재 연도를 설정할 수 있기를 원합니다. 이 배후의 아이디어는 모든 마킹 등이 끝난 다음 학년도에 수동으로 전환 할 수 있다는 것입니다. 그것은 좋은 것Django : 모델 내 모델 인스턴스 생성

class MetaData(models.Model): 
    data_id = models.IntegerField(default = 1, unique = True) 
    current_year = models.IntegerField(choices=ACADEMIC_YEARS) 

: - 현재 연도를 전환 할 수있는 기능은 다음뿐만 아니라 다른 일을하도록되어 새로운 기본 과정 등의 학생들을 넣어

그래서 나는라는 메타 데이터 모델을 생성 다른 모델에서 current_year에 액세스 할 수 있다면, 예를 들어 새로운 코스/학생을 입력 할 때 기본값으로 설정할 수 있습니다.

class Course(models.Model): 
    try: 
     meta = MetaData.objects.get(data_id=1) 
     current_year = meta.current_year 
    except MetaData.DoesNotExist: 
     current_year = 2010 
    year = models.IntegerField(choices=ACADEMIC_YEARS, default=current_year) 

불행히도, 난 오류 얻을 :이 시도 "이러한 테이블을 : database_metadata"나는 처음으로 syncdb를 실행할 때 -이 코드를 테스트 할 때 syncdb가 테이블을 작성하지 않았기 때문에 내가 추측하는 것입니다.

더 나은 솔루션이 있습니까?

답변

0

코드 내에 상수를 넣거나 (학년 계산 논리를 하드 코딩 할 수있는 경우 또는 수동으로 수정해야합니다. 이미 ACADEMIC_YEARS으로 하드 코딩했기 때문에 괜찮습니다) 또는 danodonovan가 제안합니다. 또는 직접 w/따라서 관리에, 당신은 쉽게 AcademicYear의를 강화할 수 있고 Course의 academic_year 필드의 선택로 표시 MetaData

from django.core.exceptions import ValidationError 

class AcademicYear(models.Model): 
    start = models.DateField() # or simply year 
    end = models.DateField() 
    is_current = models.BooleanField() 

    class Meta: 
     ordering = ('-is_current', 'start') 

    def clean(self): # only allow at most one current year 
     if self.is_current and \ 
      self.__class__.objects.exclude(pk=self.pk).filter(is_current=True).exists(): 
      raise ValidationError('Found another `current` academic year.' 

    def __unicode__(self): 
     return 'blahblah' 

# then in Course 
class Course(models.Model): 
    academic_year = models.ForeignKey(AcademicYear) 

에 상수를 저장 O를 학문적 년 모델. 내가 여기에 사용 싶은 것이 기본적으로 필요로하는 상수 -

def get_current_year(): 
    try: 
     return MetaData.objects.get(data_id=1).current_year 
    except MetaData.DoesNotExist: 
     return 2010 

class Course(models.Model): 
    year = models.IntegerField(choices=ACADEMIC_YEARS, default=get_current_year) 
0

ForeignKey 필드를 사용하여 모델을 연결해야하는 것처럼 들립니다.

class MetaData(models.Model): 
    current_year = models.IntegerField(choices=ACADEMIC_YEARS) 

class Course(models.Model): 
    year = models.ForeignKey(MetaData, default=this_year) 

    def this_year(self): 
     return MetaData.objects.get(current_year=datetime.now().year) 

내가 MetaData 모델에 this_year 기능을 추가 한 기본 올해 설정합니다. Course 모델 연도 속성은 기본 연도를 설정할 때이를 호출합니다.

간단한 날짜로 DateField을 사용하면 훨씬 간단 할 것입니다.

+0

외래 키가 도움이되지 것입니다 : 당신은 여전히 ​​MetaData를 사용하려는 경우

, 단지 함수가 될하기 위해 current_year 변경 1 년에 한 번씩 변경해야합니다. 2012 년부터 2013 년까지 변경되는 관리 메뉴의 버튼을 클릭하고 새 학생의 기본 과목에 모든 학생을 배치하는 등의 기능을 계획하고 있습니다. 그리고 새로운 코스를 입력하고 싶다면 current_year를 기본값으로 사용하는 것이 유용 할 것입니다. – Tobi

+1

'default ='다음에'this_year'가 classmethod와 같이 호출 가능해야합니다. – okm

+0

죄송합니다. 감사합니다. 'def this_year'이 (가) 잘못된 수업에있었습니다. – danodonovan

0
class Boat_Owner(models.Model): 
     username = models.CharField(max_length=200) 
     password = models.CharField(max_length=200) 
     name = models.CharField(max_length=200,unique=True, 
     verbose_name="Boat Owner Name") 
     address = models.CharField(max_length=200) 
     phone = models.CharField(max_length=200) 
     email = models.EmailField('email address', 
     unique=True, db_index=True) 
     avatar = models.ImageField('profile picture',  
     upload_to='static/media/images/avatars/', 
     null=True, blank=True) 
     def set_avatar(self): 
      self.has_picture = True 
     def __str__(self): 
      return u'%s %s %s %s %s %s' % (self.id,self.name,self.username,self.password,self.address,self.email) 
    class Meta: 
      verbose_name = "Boat Owner" 
      verbose_name_plural = "Boat Owner"