2010-01-20 7 views
0

J'ai déjà posé des questions pour ce projet, concernant Django Admin, Inlines, Generics, etc. Merci encore aux personnes qui ont contribué à ces réponses. Pour des informations, ces questions sont ici:Django Model Design

Django - Designing Model Relationships - Admin interface and Inline

Django Generic Relations with Django Admin

Cependant, je pense que je devrais probablement revoir à nouveau mon modèle, pour vous assurer qu'il est réellement « correct ». Donc, l'accent est mis ici sur la conception de la base de données, je suppose.

Nous avons une application Django avec plusieurs objets - Utilisateurs (qui ont un profil d'utilisateur), hôpitaux, départements, institutions (c'est-à-dire établissements d'enseignement) - tous ayant plusieurs adresses (ou aucune adresse). Il est probable que beaucoup d'entre eux auront plusieurs adresses.

Il est également possible que plusieurs objets aient la même adresse, mais c'est rare, et je suis heureux d'avoir la duplication pour les cas où cela se produit.

Actuellement, le modèle est:

class Address(models.Model): 
    street_address = models.CharField(max_length=50) 
    suburb = models.CharField(max_length=20) 
    state = models.CharField(max_length=3, choices=AUSTRALIAN_STATES_CHOICES) 
    ... 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey() 
    ... 
class Hospital(models.Model): 
    name = models.CharField(max_length=20) 
    address = generic.GenericRelation(Address) 
    ... 
class UserProfile(models.Model): 
    user = models.ForeignKey(User, unique=True) 
    address = generic.GenericRelation(Address) 
    ... 

Tout d'abord - ce que je fais ce droit, avec le champ FK sur chaque objet qui a l'adresse (s)? Deuxièmement, y a-t-il une meilleure alternative à l'utilisation de relations génériques pour ce cas, où différents objets ont tous des adresses? Dans l'autre article, quelqu'un a mentionné l'utilisation de classes abstraites - j'ai pensé à cela, mais il semble y avoir beaucoup de duplication, puisque le modèle d'adresses est fondamentalement identique pour tous. De plus, nous utiliserons fortement l'administrateur de Django, donc il doit fonctionner avec cela, de préférence aussi avec l'adresse comme inline. (C'est là que je rencontrais un problème - parce que j'utilisais des relations génériques, l'administrateur de Django attendait quelque chose dans les champs content_type et object_id, et faisait une erreur quand ils étaient vides, au lieu de donner une sorte de recherche).

Cheers, Victor

Répondre

0

Je pense que ce que vous avez fait est plus compliqué que d'utiliser une sorte de sous-classement (la classe de base peut être soit abstraite ou non).

class Addressable(models.Model): 
    ... # common attributes to all addressable objects 

class Hospital(Addressable): 
    name = models.CharField(max_length=20) 
    ... 

class UserProfile(models.Model): 
    user = models.ForeignKey(User, unique=True) 

class Address(models.Model): 
    street_address = models.CharField(max_length=50) 
    suburb = models.CharField(max_length=20) 
    state = models.CharField(max_length=3, choices=AUSTRALIAN_STATES_CHOICES) 
    ... 
    owner = models.ForeignKey(Addressable) 

Vous devriez envisager de faire la classe de base (adressable) abstraite, si vous ne voulez pas une table séparée pour dans votre base de données.