Je crée une application où un utilisateur peut s'abonner/suivre à différents aspects du site.Django ForeignKey à partir de plusieurs objets
Je construis la table qui va enregistrer tous ces abonnements. Mon instinct initial est de faire une table d'abonnement, qui énumérera tout ce qui est souscrit à. Voici comment je prévois maintenant:
class SubscriptionTypeCode(object):
CITY = '1'
REGION = '2'
COUNTRY = '3'
USER = '4'
SUBSCRIPTION_TYPE_CHOICES = (
(SubscriptionTypeCode.CITY, 'City'),
(SubscriptionTypeCode.REGION, 'Region'),
(SubscriptionTypeCode.COUNTRY, 'Country'),
(SubscriptionTypeCode.USER, 'User'),
)
class Subscription(models.Model):
subscriber = models.ForeignKey(User, related_name="subscriber")
subscription_type = models.CharField(max_length=4, choices=SUBSCRIPTION_TYPE_CHOICES)
subscription_to_user = models.ForeignKey(User, related_name="subscription_to_user", null=True, blank=True)
subscription_to_city = models.ForeignKey(City, null=True, blank=True)
subscription_to_country = models.ForeignKey(Country, null=True, blank=True)
subscription_to_region = models.ForeignKey(Region, null=True, blank=True)
created = models.DateTimeField(db_index=True, auto_now_add=True)
cancelled = models.DateTimeField(null=True, blank=True)
Cela devrait fonctionner, mais je me demande si c'est la façon la plus efficace de le faire. Chaque ligne aura l'ID de l'abonné, puis le choix du type, puis, en fonction de cela, l'une des colonnes subscription_to aura un objet étranger.
Cela fonctionne, mais nécessite beaucoup d'instructions if/else dans la logique. Par exemple
def create_subscription(request, subscription_type, subscription_id):
subscription = Subscription.create(
subscriber = request.user,
subscription_type = subscription_type,
)
if subscription_type == SubscriptionTypeCode.REGION:
region = get_region(subscription_id)
subscription.subscription_to_region = region
elif subscription_type == SubscriptionTypeCode.CITY:
city = get_city(subscription_id)
subscription.subscription_to_city = city
elif subscription_type == SubscriptionTypeCode.COUNTRY:
country = get_country(subscription_id)
subscription.subscription_to_country = country
elif subscription_type == SubscriptionTypeCode.USER:
user = get_user(subscription_id)
subscription.subscription_to_user = user
subscription.save()
return subscription
Des idées sur la façon de simplifier cela? Ou est-ce correct?