gpt4 book ai didi

python - 访问时自动创建 OneToOneField

转载 作者:太空宇宙 更新时间:2023-11-03 19:03:16 25 4
gpt4 key购买 nike

我有两个模型:

class Profile(models.Model):
# (...)
settings = models.OneToOneField('Settings', null=True)
# (...)

class Settings(model.Model):
# (...)

有没有办法在访问 Profile#settings 时创建 Settings 实例?

更新:我想要这个的主要动机是我已经有了Profile模型,并且我希望延迟创建Setting关系当用户到达需要 Profile#setting 实例的应用程序点时,而不关心它是否已创建。

更新: @miki725 在下面说这已经由 Django 处理了。我尝试了以下方法:

class SettingsTest(TestCase):
def setUp(self):
user = User.objects.create(username='felipe', email='something@aol.com')
self.profile = Profile.objects.create(short_name='Felipe', name='Felipe',
user=user)

def test_settings(self):
self.assertIsNotNone(self.profile.settings)

我明白了:

Creating test database for alias 'default'...
F
======================================================================
FAIL: test_settings (activity.tests.settings.SettingsTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/vagrant/activity/tests/settings.py", line 20, in test_settings
self.assertIsNotNone(self.profile.settings)
AssertionError: unexpectedly None

----------------------------------------------------------------------
Ran 1 test in 0.003s

最佳答案

这是 Django 自动完成的!

>>> p = Profile.objects.get(...)
>>> isinstance(p.settings, Settings)
True

更新

如果您得到 None,则意味着 Profile 模型中的外键值为 null,因为您允许 null 值 null=True。在这种情况下,您实际上无能为力:

>>> p = Profile(settings=None, ...)
>>> p.save()
>>> p = Profile.objects.get(pk=p.pk)
>>> p.settings # the settings can't be anything because you never assigned them
None

如果您需要它进行测试,那么您必须为 Profile 实例分配一些设置值:

class SettingsTest(TestCase):
def setUp(self):
user = User.objects.create(username='felipe', email='something@aol.com')
self.settings = Settings.objects.create(...)
self.profile = Profile.objects.create(short_name='Felipe',
name='Felipe',
user=user,
settings=self.settings)

顺便说一句,从 Django 1.5 开始,您可以配置您的用户模型。在您必须创建一个配置文件模型之前,该模型必须具有与用户模型一对一的 key 。现在不再需要了。您只需将字段添加到用户模型即可。您可以在 Django 1.5 发行文档 ( https://docs.djangoproject.com/en/dev/releases/1.5/#configurable-user-model ) 中阅读有关此内容的更多信息。

更新

现在您的动机更加明确了,您可以使用这种黑客方法来实现这一目标。我认为这不是最好的方法,但它应该有效:

Profile(models.Model):
def get_default_settings(self):
settings = Settings.objects.create(...)
self.settings_id = settings.pk
return settings

def __getattribute__(self, name):
default = object.__getattribute__(self, name)
if name == 'settings':
if default is None:
return self.get_default_settings()
else:
return default
else:
return default

关于python - 访问时自动创建 OneToOneField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15514972/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com