Ищете способ, в котором и как правильно назначить связанную модель Django с общим отношением, объявленным в абстрактной модели, из других моделей. пыльник моя попытка добавить ManyToOne отношения для всех потомков, вытекающих из cartridge.shop.models.Priced
абстрактной модели:Django & GenericForeignKey от абстрактной модели?
# cartridge.shop.models unit
# This is a 3rd party module I can't alter sources directly.
# Only monkeypatching or sublclassing are options.
from django.db import models
class Priced(models.Model):
"""
Abstract model with unit and sale price fields. Inherited by
``Product`` and ``ProductVariation`` models.
"""
unit_price = fields.MoneyField(_("Unit price"))
class Meta:
abstract = True
# Product derives from abstract Priced model
class Product(Priced, …):
pass
# my_application.models module
from cartridge.shop.models import Priced, Product
from django.db import models
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
from django.utils.translation import ugettext_lazy as _
# Simple example of a django model I wish make ForeignKey
# relationship to from all descendants of Priced model
class VAT(models.Model):
description = models.CharField(blank=False, null=False, max_length=36)
rate = models.DecimalField(
blank=False, null=False, decimal_places=2, max_digits=2+3)
class Meta:
verbose_name = _("Value Added Tax")
verbose_name_plural = _("Value Added Taxes")
Priced.vat_contype = models.ForeignKey(ContentType)
Priced.vat_id = models.PositiveIntegerField()
Priced.vat = GenericForeignKey('vat_contype', 'vat_id')
Product.vat = VAT() # Specify the concrete model here ? This way ?
Я также не уверен, что это правильный путь, как решить ForeignKey
отношения для потомков абстрактной модели. Я делаю вещи излишне сложными? Мог ли решить с помощью единственного ContentType
без всех GenericForeignKey
cruft? Другой путь ?
Я знаю о наследовании подклассов и множестве таблиц, но мне бы очень хотелось избежать создания дополнительных таблиц, в которых, как минимум, было бы проще и быстрее добавлять столбцы.
Спасибо за ответ. У меня уже возникла идея подкласса базового абстрактного класса «Priced», но тогда мне также нужно было бы создать новую модель производного продукта, которая создала бы новую таблицу, если я не ошибаюсь. Но этого я и старался избегать. Я смотрю, как настраивать модели фреймворка, добавляя несколько дополнительных полей - не заменяя их и не создавая десятки дополнительных таблиц путем подкласса, просто для тех дополнительных полей, которые приведут к посторонним объединениям db и более низкой общей производительности. –
Я относительно новый в Django. В Rails эта проблема решается очень просто, корректируя исходную модель в блоке 'class_eval' и создавая простую миграцию, которая добавляет новые поля. Никаких конфликтов, бессмысленных осложнений. –
Абстрактные модели не создают таблицы базы данных. Так, например, в первом фрагменте кода, который я привел выше, была бы создана таблица для продукта со всеми полями, которые Продукт наследует и определяет. Не было бы таблицы базы данных для PricedWithVAT, и никакие посторонние db не объединяются так, как вы думаете. –