Расширение объекта Django / вопросы отношения один к одному - PullRequest
1 голос
/ 31 июля 2010

Хауди.Я работаю над миграцией внутренней системы на Django и столкнулся с несколькими морщинами.

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

Базовые объекты
Итак, у меня есть два базовых объекта / модели:

  • JournalEntry
  • JournalEntryItems

определяется следующим образом:

class JournalEntry(models.Model):
    gjID = models.AutoField(primary_key=True)
    date = models.DateTimeField('entry date');
    memo = models.CharField(max_length=100);

class JournalEntryItem(models.Model):

    journalEntryID = models.AutoField(primary_key=True)
    gjID = models.ForeignKey(JournalEntry, db_column='gjID')
    amount = models.DecimalField(max_digits=10,decimal_places=2)

Пока все хорошо.Это работает довольно гладко на стороне администратора (встроенная работа и т. Д.)

Переходим к следующему разделу.
Затем у нас есть еще две модели

  • InvoiceEntry
  • InvoiceEntryItem

InvoiceEntry - это расширенный набор / наследуется от JournalEntry, поэтому я использовал OneToOneField (который мы используем в фоновом режиме на нашем текущем сайте).Это тоже работает довольно гладко.

class InvoiceEntry(JournalEntry):
    invoiceID = models.AutoField(primary_key=True, db_column='invoiceID', verbose_name='')
    journalEntry = models.OneToOneField(JournalEntry, parent_link=True, db_column='gjID')
    client = models.ForeignKey(Client, db_column='clientID')

    datePaid = models.DateTimeField(null=True, db_column='datePaid', blank=True, verbose_name='date paid')

Я сталкиваюсь с проблемами при попытке добавить InvoiceEntryItem (который наследуется от JournalEntryItem) к встроенному, связанному с InvoiceEntry.Я получаю сообщение об ошибке:

<class 'billing.models.InvoiceEntryItem'> has more than 1 ForeignKey to <class 'billing.models.InvoiceEntry'>

Как я вижу, InvoiceEntryItem имеет ForeignKey непосредственно для InvoiceEntry.И у него также есть косвенный ForeignKey для InvoiceEntry через отношение JournalEntry 1-> M JournalEntryItems.

Вот код, который я сейчас использую.

class InvoiceEntryItem(JournalEntryItem):
    invoiceEntryID = models.AutoField(primary_key=True, db_column='invoiceEntryID', verbose_name='')
    invoiceEntry = models.ForeignKey(InvoiceEntry, related_name='invoiceEntries', db_column='invoiceID')
    journalEntryItem = models.OneToOneField(JournalEntryItem, db_column='journalEntryID')
  1. Я пытался удалить журнал EntryItem OneToOneField.Это затем удаляет мою способность получить сумму в долларах для этого конкретного InvoiceEntryItem (который хранится только в journalEntryItem).

  2. Я также пытался удалить отношение invoiceEntry ForeignKey.Это удаляет связь, которая позволяет мне видеть InvoiceEntry 1-> M InvoiceEntryItems в строке администратора.Все, что я вижу, - это пустые поля (вместо фактических данных, которые в настоящее время хранятся в БД).

Кажется, что вариант 2 ближе к тому, что я хочу сделать.Но моя неопытность с Джанго, кажется, ограничивает меня.Я мог бы отфильтровать большой пул записей журнала, чтобы увидеть только записи счета.Но было бы очень удобно думать об этом исключительно как о счетах (а не о подмножестве записей в журнале).

Есть мысли о том, как сделать то, что мне нужно?

Ответы [ 2 ]

1 голос
/ 03 августа 2010

Во-первых, наследование от модели создает автоматический OneToOneField в унаследованной модели по отношению к родителям, поэтому вам не нужно добавлять их.Удалите их, если вы действительно хотите использовать эту форму наследования модели.

Если вы хотите использовать только член модели, вы можете использовать мета-наследование, которое создаст унаследованные столбцы в таблице вашей унаследованной модели.Таким образом, ваш JournalEntry будет разделен на 2 таблицы, но будет легко получить только счета.

0 голосов
/ 31 июля 2010
  1. Все поля в суперклассе также существуют в подклассе, поэтому наличие явного отношения не требуется.
  2. Модель наследования в Джанго ужасна. Не используйте это. Python все равно не нужен.
...