0

おそらく非常に基本的な Django の質問がもう 1 つあります。クラス用のデータベース アプリを作成しています。アプリ内から現在の年を設定できるようにしたいと考えています。この背後にある考え方は、すべての採点などが完了したら、次の学年に手動で切り替えることができるということです。現在の年を切り替える機能は、他のことも行うことになっています-学生を新しいデフォルトコースに入れるなど。

そこで、MetaData というモデルを作成しました。

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)

残念ながら、syncdb を初めて実行すると、"No such table: database_metadata" というエラーが表示されます。これは、コードのテスト時に syncdb がテーブルを作成していないためだと思います。

これに対するより良い解決策はありますか?

4

3 に答える 3

0

定数をコード内に配置するか(学年度の計算のロジックをハードコーディングできる場合。または、常に手動で変更することを忘れないでください。すでにハードコーディングしているので問題ありませんACADEMIC_YEARS)、またはdanodonovanが示唆するようにDBに配置します。または、定数を保存せずに直接学年度をモデル化する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)

したがって、管理者では、を簡単にステップアップしAcademicYearて、のacademic_yearフィールドの選択肢として表示できますCourse

それでも使用したい場合は、を関数にMetaData変更してください。current_year

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)
于 2013-02-03T16:11:30.913 に答える
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)

デフォルトの年を設定するために、モデルにthis_year関数を追加しました。MetaDataモデルのCourse年属性は、デフォルトの年を設定するときにこれを呼び出します。

そうは言っても、DateField単純な日付にを使用すると、はるかに簡単になります。

于 2013-02-03T12:19:24.323 に答える
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"
于 2015-06-09T08:48:46.687 に答える