例如,如果我有一个类摘要,
类摘要的每个实例,可以是一个主题:
subjects = (
('english', 'אנגלית'),
('bible', 'תנ"ך'),
('history', 'היסטוריה'),
('civics', 'אזרחות'),
('language', 'לשון'),
('literature', 'ספרות'),
)
class Summary(models.Model):
...
subject = models.CharField(max_length=20, choices=subjects)
...
现在我决定要为每个主题硬编码一些主题,所以如果 Summary.subject = "literature" 我想添加一个字段
subtopic = models.CharField(choices=literature_subtopics)
并使选择等于:
literature_subtopics = (
('poems', 'שירה'),
('short_stories', 'סיפורים קצרים'),
('plays', 'מחזות'),
('novels', 'נובלות'),
)
如果主题是英语,则 english_subtopics 将用于选项字段。
我想对所有这些部门进行硬编码,因为它们不会每隔几年更改一次(如果有的话),将它们存储在数据库中毫无意义。
我需要以某种方式为每个主题设置所有这些划分,并让 Django 适本地为子主题设置选择字段。
我可以覆盖 init 方法来以某种方式完成这个吗?我听说这是个坏主意,会破坏一切。
请您参考如下方法:
即使数据不经常变化,将数据放在数据库中,将 Python 放在 Python 文件中似乎是最自然的。您提出的解决方案似乎是在与 Django 想要做事的方式作斗争。
如何看待数据库解决方案?
class Subject(models.Model):
parent = models.ForeignKey("self")
name = models.CharField(max_length=100)
hebrew_name = models.CharField(max_length=100)
class Summary(models.Model):
...
subject = models.ForeignKey("Subject")
...
class SubjectForm(forms.Form):
subject = forms.ModelChoiceField(queryset=Subject.objects.none())
...
def __init__(self, *args, **kwargs): # see http://stackoverflow.com/a/4880869/1477364
sub = kwargs.pop('parent_subject')
super(SubjectForm, self).__init__(*args, **kwargs)
parent_subject = Subject.objects.get(name=sub)
sub_subjects = Subject.objects.filter(parent=parent_subject)
self.fields['subject'].queryset = forms.ModelChoiceField(queryset=sub_subjects)
请注意,代码暗示总会有一个父 Subject 传递给 SubjectForm。 (您需要一个“根”主题。)
