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/