2012-02-13 6 views
4

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?

Répondre

3

Vous pouvez utiliser generic foreign keys (avec un seul champ subscription_to) ou model inheritance (ayant sous-classes de Subscription pour les différents types d'abonnement, qui au moins vous permettre de structurer votre code mieux).