我在 models.py 中有一些类,在添加一个类后,我需要在已经创建的类中添加一个属性,我在互联网上发现最好的方法是使用
setattr()
函数,所以我完成所有并且..似乎有效,没有错误,它在管理站点中显示为 <django.db.models.fields.related.OneToOneField>
,但是当我尝试创建或更改此字段时无法选择它,没有,这是一个错误还是我做错了?
这是我的代码:
class PlayerInstance(models.Model):
#...
class Competition(models.Model):
#...
setattr(PlayerInstance, 'choice_to_competition', models.OneToOneField(
Competition,
default = 'for_nothoing',
on_delete=models.RESTRICT,
help_text='which competition is it taking part?',
))
不,我没有忘记将“choice_to_competition”添加到列表显示中。 这里有两张管理站点的照片:我制作了它们,但我无法将它们添加到这里,无法理解原因,但这并不是真正必要的。
我在网上发现最好的方法是使用
函数,所以我全部做了和。setattr()
不。对于可能有效的“普通”课程。但是 Django 的
Model
有一些高级的元逻辑,这意味着在构造类时未传递的属性可能最终不会出现在模型中。
你需要的是使用
.contribute_to_class(…)
方法,例如:
models.OneToOneField(
Competition,
default='for_nothoing',
on_delete=models.RESTRICT,
help_text='which competition is it taking part?',
).contribute_to_class(PlayerInstance, 'choice_to_competition')
ForeignKey
[Django-doc]、OneToOneField
model 字段[Django-doc] 和 ManyToManyField
model字段[Django-doc],您可以使用字符串文字来引用尚未定义的模型,其中:
class PlayerInstance(models.Model):
choice_to_competition = models.OneToOneField(
'app_name.Competition',
default='for_nothoing',
on_delete=models.RESTRICT,
help_text='which competition is it taking part?',
)
# …
class Competition(models.Model):
# …
如果模型具有相同的应用程序标签,您甚至可以删除
app_label
:
class PlayerInstance(models.Model):
choice_to_competition = models.OneToOneField(
'Competition',
default='for_nothoing',
on_delete=models.RESTRICT,
help_text='which competition is it taking part?',
)
# …
class Competition(models.Model):
# …
注意:型号通常没有
后缀。类中的对象始终称为“实例”,通过将类命名为Instance
,人们会觉得该变量是类的实例。…Instance