обратный поиск в моделе django - PullRequest
1 голос
/ 10 января 2011

У 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)
    ...

Как заставить клиентский метод возвращать last_name из ClientDetails?

Ответы [ 2 ]

3 голосов
/ 10 января 2011

Если объект ClientDetails должен когда-либо ассоциироваться только с одним объектом Client, тогда я бы изменил ваш FK на OneToOneField, который предоставит вам аккуратный обратный метод доступа, который может когда-либо связываться только между данным клиентом и его связанными 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, связанных с этим клиентом и вы получите здесь только детали первого.)

Итак, я действительно рекомендовал бы использовать OneToOneField вместо этого FK. (Все OneToOneField - это в основном FK с установленным unique=True и некоторыми более аккуратными аксессуарами, чем стандартные FK)

2 голосов
/ 10 января 2011

Для этого вы можете использовать в клиенте * clientdetails_set * для доступа ко всем объектам ClientDetails, которые связаны с этим клиентом.

Набор - это набор объектов из Django, поэтому вызывается метод all() извлечет каждый из объектов.Если вы знаете, что есть только один, вы можете сделать self.clientdetails_set.all () [0] .last_name

Вот ссылка на документацию django: Ссылка

...