如何将OneToOneField添加到使用setattr函数创建的管理站点中的BD中

问题描述 投票:0回答:1

我在 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”添加到列表显示中。 这里有两张管理站点的照片:我制作了它们,但我无法将它们添加到这里,无法理解原因,但这并不是真正必要的。

python django django-models django-admin
1个回答
0
投票

我在网上发现最好的方法是使用

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
,人们会觉得该变量是类的实例。

© www.soinside.com 2019 - 2024. All rights reserved.