python - 模型方法中的django反向查找

标签 python django django-models

Google 有很多在交互式提示中进行反向查找的示例,但没有一个是在 django 模型中作为一种方法进行的。

我有以下 models.py 文件:

class Client(models.Model):
    ...

    def __unicode__(self):
        return ???

class ClientDetails(models.Model):
    client = models.ForeignKey(Client, null=True)
    created = models.DateTimeField(default=datetime.now)
    created_by = models.ForeignKey(User, null=True)
    name_title = models.CharField(max_length=3, choices=NAME_TITLE_CHOICES)
    first_name = models.CharField(max_length=40)
    middle_name = models.CharField(max_length=40)
    last_name = models.CharField(max_length=40)
    ...

如何让客户端方法从 ClientDetails 返回 last_name?

最佳答案

如果 ClientDetails 对象只应与单个 Client 对象相关联,那么我会将您的 FK 更改为 OneToOneField,这将为您提供一个简洁的反向访问器,该访问器只能在给定的 Client 及其关联的 ClientDetails 之间进行链接.然后你可以这样做:

try:
   return self.clientdetails.last_name
except ClientDetails.DoesNotExist:
   ##handle it here, returning a graceful message

或者,如果您将其保留为 FK,则您必须执行以下操作:

try:
    self.clientdetails_set.all()[0].last_name
except IndexError, e:
    ## handle exception here

但是在这里使用 FK 是脆弱的并且不是很好的形式(正如异常处理所暗示的那样:如果没有返回任何内容,那么您将得到一个 IndexError。此外,可能有多个 ClientDetails 对象链接到该 Client ,您只会在此处获得第一个的详细信息。)

所以,我真的会推荐使用 OneToOneField 而不是 FK。 (所有 OneToOneField 基本上都是一个 FK,上面设置了 unique=True 和一些比标准 FK 更整洁的访问器)

关于python - 模型方法中的django反向查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4646352/

相关文章:

python - 读取和写入同一个 csv 文件

python - 我在 django 中的评论表单不起作用?它既不向数据库发送数据也不显示这些数据?

python - Django 动态访问相关属性?

python - 如何将列表转换为以逗号分隔的字符串?

django - 模板中的文件字段大小和名称

django - 检查对象是否属于 Django 中多对多关系的一部分的最佳做法是什么

python - 让 Django 仅返回存储为 models.TextField() 的文本的前 50 个字符

django - ExtractYear 和 ExtractMonth 在 Django 中返回 None

python - django 条件 url verify_exists

python - 将标签与json格式的句子进行匹配