Django: как наследовать и запрашивать связанные поля - PullRequest
1 голос
/ 03 августа 2011

Я долго искал ответ на этот вопрос. Как добавить поле из одной модели в связанную модель и запросить данные связанных моделей.

Вот пример: у одного человека много рабочих мест.

class Person(models.Model):
    PersonId = models.AutoField(primary_key=True)
    FirstName = models.CharField(max_length=200, default='')
    LastName = models.CharField(max_length=200, default='')

class Job(models.Model):
    JobId = models.AutoField(primary_key=True)
    JobName = models.CharField(max_length=200, default='')
    Person = models.ForeignKey(Person, db_column='PersonId')

    def _fullname(self):
        return self.Person.FirstName + " " + self.Person.LastName
    fullname = property(_fullname)

Приведенный выше код работает!

jobs = Job.objects.select_related()
for job in jobs:
    print job.fullname

Теперь я думаю, что у меня другая проблема. Получение Django Rest Framework для сериализации этих дополнительных свойств. Время нового поста.

Теперь я хочу, чтобы я мог запрашивать задания и получать связанные данные о человеке, а также иметь поля с персоналом в работе. Таким образом, когда я запрашиваю вакансии, я могу использовать job.FirstName. Я в основном хочу сделать ярлык для полей Person из Job. Это похоже на то, что Иов наследует поля Человека.

Ожидаемый эффект этого сайта будет заключаться в том, что при сериализации Job как json для ресурса отдыха результат будет включать данные поля Person.

Я пришел из .Net C # фона. Теперь, поскольку я использую Python / Django, я понятия не имею, как это сделать.

Ответы [ 3 ]

1 голос
/ 04 августа 2011

Пример набора запросов, который получает отфильтрованный список Job объектов:

joblist = Job.objects.filter(statement1,statement2...)

Вы можете получить доступ к лицам, связанным с ForeignKey с объектами Job следующим образом

for j in joblist:    
    print j.Person.FirstName, j.Person.LastName

Если вам точно нужны все связанные объекты в каждой записи Job , вы должны использовать select_related queryset

joblist = Job.objects.select_related().filter(statement1,statement2...)

Сериализация: Вы можете использовать natural_keys , но это ограничено ограничениями БД. Или вы можете использовать Piston и определить обработчик, который будет создавать вложенный JSON.

Обратите внимание, вам не нужно создавать AutoField для каждой модели, это указано соглашением и может быть достигнуто по адресу model_instance.id.

Также я рекомендую вам следовать PEP8 соглашениям.

0 голосов
/ 04 августа 2011

Попробуйте, это звучит так, как вы хотите.

Тогда Работа - это Личность, о которой вы и просите. Это не абстрактное наследование, поэтому в вашей БД будет две таблицы.

$> # This will dump the sql that's generated.
$> ./manage.py sql this_app

Job.FirstName будет работать. Читайте о модели наследования . Вам даже может понадобиться использовать менеджер ModelInheritance django-model-utils, что очень хорошо.

class Person(models.Model):
    PersonId = models.AutoField(primary_key=True)
    FirstName = models.CharField(max_length=200, default='')
    LastName = models.CharField(max_length=200, default='')

class Job(Person):
    JobId = models.AutoField(primary_key=True)
    JobName = models.CharField(max_length=200, default='')
0 голосов
/ 04 августа 2011

Если вы запрашиваете свою работу с чем-то вроде job = Job.objects.get(personid=1) вы увидите, что он также перемещается по смежным полям, это вуду за кулисами. По сути, теперь вы можете сделать job.person.firstname, job.person.lastname и т.д ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...