在 Django 中访问一对一 table 字段值

Accessing one-to-one table field value in Django

我有一个 Django 模型,它与 Django 站点建立了一对一的字段关系

from django.contrib.sites.models import Site

class SiteSettings(models.Model):
    site = models.OneToOneField(Site, related_name="settings", on_delete=models.CASCADE)
    header_text = models.CharField(max_length=200, blank=True)

我想从站点模型访问站点设置 table 中的 header_text 字段。我尝试使用以下方法获取值:

value = Site.settings.header_text
print(value)

我收到错误:

AttributeError: 'ReverseOneToOneDescriptor' object has no attribute 'header_text'

感谢任何帮助。

Site 是对 Site class 的引用,而不是 Site 对象。您可以使用get_current() [Django-doc]获取当前站点,然后使用反向关系:

from django.contrib.sites.shortcuts import get_current_site

<b>get_current()</b>.settings.header_text

如果没有多个站点,首先使用 ForeignKeySite 没有多大意义,因为只有一个。那样的话,你可以做一个模型:

# if there are no multiple Sites
from django.db import models

class SiteSettings(models.Model):
    # <i>no</i> ForeignKey to Site
    header_text = models.CharField(max_length=200, blank=True)

然后你要确保恰好SiteSettings的记录,然后你访问它:

# if there are no multiple Sites and only <i>one</i> SiteSettings record
SiteSettings.objects<b>.get()</b>.header_text

您可以使用 .only(…) [Django-doc]:

稍微提高性能
# if there are no multiple Sites and only <i>one</i> SiteSettings record
SiteSettings.objects<b>.only('header_text')</b>.get().header_text