Skip to main content
 首页 » 编程设计

python之根据字段值更改 Django 模型中的选择

2025年05月04日28yxwkf

例如,如果我有一个类摘要,

类摘要的每个实例,可以是一个主题:

    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。 (您需要一个“根”主题。)