Я не до конца понимаю ваш вопрос, но вы можете использовать
ForeignKey('ModelName')
вместо
ForeignKey(ModelName)
, если модель ModelName
еще не объявлена. Может быть, это решит вашу проблему.
Встроенные администраторы (например, TabularInline
) используются только при наличии отношения «один ко многим», которое создается ForeignKey
на стороне many . Если у вас нет такого внешнего ключа, вы не можете использовать встроенного администратора. Наследование определенно отличается от ForeignKey
.
Однако я думаю, что ваша модель данных неверна. Кажется, вы хотите хранить счета. Существует два типа счетов: emitted
и received
. Счета emitted
и received
имеют одинаковые поля. Кроме того, вы хотите, чтобы каждый счет состоял из заголовка с номером, клиентом и датой, 1 или более записей тела, где каждая запись хранит информацию, которую вы храните в BillBody
и 1 или более десятичных знаков base_number
.
Вероятно, лучшая модель данных для вас
class Bill(models.Model):
number = models.CharField(_('Bill number'), max_length=10, unique=True, default=__number)
client = models.ForeignKey(ClienteYProveedor, verbose_name=_('Client'))
date = models.DateTimeField(_('Date'), default=datetime.now)
def get_total_price(self):
return sum([entry.price for entry in self.entries])
class BillEntry(models.Model):
bill = models.ForeignKey(Bill, related_name='entries')
description = models.CharField(_('Description'), max_length=200)
amount = models.DecimalField(_('Amount'), max_digits=6, decimal_places=2)
discount = models.DecimalField(_('Discount'), max_digits=4, decimal_places=2)
price = models.DecimalField(_('Price'), max_digits=12, decimal_places=2)
unitaryprice = models.DecimalField(_('Unitary Price'), max_digits=12, decimal_places=2)
Я пропустил __unicode__
методы.
Теперь у вас есть внешний ключ от BillEntry
до Bill
, и вы можете использовать табличную строку. Я не понял, как вы используете base_import
, поэтому я пропустил это.
Расчет цены
Если ваш price
должен всегда равняться чему-то вроде amount*unitaryprice - discount
или amount*(unitaryprice-discount)
, тогда вы не должны помещать это в поле, а вычислять его, когда это необходимо, в Python или в базе данных. Если вы хотите сделать это в Python, вы можете использовать метод, подобный get_total_price
. Если вы хотите вычислить их при запросе к базе данных, то немного сложнее заставить ее работать с Django.
В последнем случае вы можете взглянуть на представления SQL, но я думаю, что это немного сложно для новичка. Другой вариант - использовать пользовательское выражение SQL:
BillEntry.objects.extra(select={'price': 'amount*unitaryprice-discount'})
Это вычислит цену для всех записей во время выбора.
Update
Если вы добавляете два подкласса для выставленных и полученных счетов и используете наследование нескольких таблиц , то вы можете использовать один внешний ключ от BillEntry
до Bill
.
class EmittedBill(Bill):
pass
class ReceivedBill(Bill):
pass
Возможно, вам также следует подумать о модели базы данных, сгенерированной Django. Обычно вы хотите хранить только элементарные данные в базе данных, а не вычисленные данные (как вы хотите сделать в нижнем колонтитуле). Таким образом, если цены рассчитываются с использованием некоторой формулы и с использованием unitaryprice
, amount
и т. Д., Вы не должны хранить результат этой формулы, а пересчитывать его при необходимости (и в конечном итоге кэшировать, чтобы избежать повторных вычислений). Если вы этого не сделаете, есть вероятность, что вы в какой-то момент обновите что-то (например, amount
) и забудете обновить вычисленные значения (price
), что приведет к несогласованности в вашей базе данных (и, следовательно, к ошибкам в ваше приложение). Хорошая база данных имеет ограничения, поэтому невозможно хранить противоречивые базы данных, не нарушив хотя бы одно ограничение.
Я также не понимаю, почему вы хотите отдельный колонтитул для счета. Модель не реальный счет, она хранит информацию для счета. Если вы хотите иметь видимый верхний и нижний колонтитулы, то вы должны сделать это в своем слое представления (шаблоне), а не в самой модели.