Django: запрос pk всех моделей - PullRequest
       9

Django: запрос pk всех моделей

1 голос
/ 15 сентября 2011

Мне нужно сделать запрос по нескольким таблицам по primary_keys, которые являются уникальными (uuids).

Моя идея состояла в том, чтобы использовать наследование моделей для запроса всех моделей одновременно.У меня есть BaseItem, и все другие модели являются подклассами этой модели BaseItem.

Теперь мой запрос не возвращает то, что я ожидал и нуждался.Вот пример модели:

from django.db import models
from django.contrib.auth.models import User


class BaseRev(models.Model):
    rev_id = models.CharField(max_length=32, primary_key=True)
    item_id = models.CharField(max_length=32, blank=True, null=True)
    creation_date = models.DateTimeField()


class NamedRev(BaseRev):
    name = models.CharField(max_length=64, blank=True, null=True)
    description = models.CharField(max_length=256, blank=True, null=True)
    creator = models.ForeignKey('UserProfile', related_name='namedrev_creator', blank=True, null=True)

Когда я создаю NamedRev с pk = "1234" и выполняю запрос типа

BaseRev.objects.get(pk="1234")

, я получаю результат с правильным pk, но этотипа BaseItem.В соответствии с документами, это правильное поведение, поскольку поле rev_id существует только в таблице BaseRev и дополнительные поля для NamedRev в таблице NamedRev.

Как получить "правильные" и полные (со всеми полями) объекты типа NamedRev для данного запроса?

Приветствия,

Ян

Ответы [ 3 ]

0 голосов
/ 15 сентября 2011

После того, как вы получили BaseRev, выполните:

>>> base_rev = BaseRev.objects.get(pk="1234")
>>> base_rev.namedrev
<NamedRev: NamedRev object>

Присвойте вышеуказанное другой переменной, и вы сможете получить доступ к полям NamedRev.

0 голосов
/ 09 января 2013

вы можете вставить поле типа в вашу базовую модель, чтобы вы могли запросить базовую модель, а затем запросить ее типпереопределить save() метод каждой модели для установки типа перед сохранением.

0 голосов
/ 15 сентября 2011

Что если вы установите родительский класс как абстрактный:

class BaseRev(models.Model):
    rev_id = models.CharField(max_length=32, primary_key=True)
    item_id = models.CharField(max_length=32, blank=True, null=True)
    creation_date = models.DateTimeField()

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