У меня есть модель схемы, которая может иметь только 2 награды, один для члена схемы, а другой для своего друга.Дизайн модели Django с использованием GenericForeignKey
Ниже приведен пример того, как у меня есть модель для этого, но теперь я начинаю сомневаться в дизайне. Неправильно ли ссылка на Схему и награды? Должен ли я иметь отношения наоборот на абстрактной награде?
Схема:
class Scheme(models.Model):
name = models.CharField(max_length=60)
participant_reward_content_type = models.ForeignKey(ContentType,
editable=False,
related_name='%(app_label)s_%(class)s_as_participant',
null=True, blank=True
)
participant_reward_object_id = models.PositiveIntegerField(null=True, blank=True)
participant_reward = generic.GenericForeignKey('participant_reward_content_type', 'participant_reward_object_id')
friend_reward_content_type = models.ForeignKey(ContentType,
editable=False,
related_name='%(app_label)s_%(class)s_as_friends',
null=True, blank=True
)
friend_reward_object_id = models.PositiveIntegerField(null=True, blank=True)
friend_reward = generic.GenericForeignKey('friend_reward_content_type', 'friend_reward_object_id')
Награды:
class AbstractReward(models.Model):
"""
Abstract reward common information shared for all rewards.
"""
description = models.CharField(max_length="150")
active = models.BooleanField(default=True)
#scheme = models.ForeignKey(Scheme, null=True,)
class Meta:
abstract = True
class SingleVoucherReward(AbstractReward):
"""
Single-use coupons are coupon codes that can only be used once
"""
pass
class Meta:
app_label = 'schemes'
class MultiVoucherReward(AbstractReward):
"""
A multi-use coupon code is a coupon code that can be used unlimited times.
"""
code = models.CharField(max_length=200)
expiry = models.DateTimeField(null=True)
class Meta:
app_label = 'schemes'
class CustomReward(AbstractReward):
"""
A reward class used when it can't be handled or they would like to
handle reward fulfillment themselves.
"""
pass
class Meta:
app_label = 'schemes'
Спасибо DaveB, вы очень интересные комментарии, читая два совок Django прямо сейчас. – Prometheus
Моя единственная проблема с этим подходом заключается в том, что разные награды имеют расширенные свойства, которые не обязательно относятся к каждому. Вот почему у меня есть абстрактная модель для базы. Мне нравится идея использования селекторов tho. – Prometheus
Прокси-модели, это интересно, я не знал, что вы даже можете это сделать, хорошо. Единственный улов - это «наследовать от одного не абстрактного модельного класса», – Prometheus