2011-09-09 6 views
0

Pour certaines raisons (en particulier, pour essayer de faire système DB mise à niveau plus facile), je dois stocker toutes les propriétés étendues de l'utilisateur dans un autre objet (comme dans this question pour séparer personne et adresse)Stockage des informations supplémentaires sur les utilisateurs de Django

J'ai un ensemble de remplacement AUTH_PROFILE_MODULE et capture def_user_profile.

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

def create_user_profile(sender, instance, created, **kwargs): 
    if created: 
     CustomUser.objects.create(user=instance) 

La question est: si j'ajouter une propriété de type personnalisé à CustomUser, comme ceci:

class CustomPropertySet(models.Model): 
    this_is_a_Farmer = models.BooleanField() 

class CustomUser(models.Model): 
    user = models.ForeignKey(User, unique=True) 
    extdata = models.CustomProperySet() 

cela créera automatiquement une entrée CustomProperySet à l'ajout d'un nouvel utilisateur? Est-ce que CustomPropertySet doit être associé à ForeignKey à son propriétaire CustomUser? Deuxième question: comment supprimer les propriétés étendues de cette manière lorsque l'objet est supprimé?

Répondre

1

La réponse évidente à ces derniers est « l'essayer et découvrir », mais nous sommes un peuple poli ici ...

  • aura-t-il créer automatiquement CustomPropertySet?

Lorsque vous affectez quelque chose à extdata, qu'est-ce que vous assignez? Assigner True et False ne fonctionnera probablement pas, vous devrez assigner une instance CustomPropertySet, et pour en obtenir une, vous devrez en créer une. Essayez-le et cela deviendra clair.

  • Est-ce que CustomPropertySet doit pointer vers une instance CustomUser?

Non, le CustomProper t yset peut survivre tout sur c'est tout seul. Votre CustomUser y fait référence, mais il n'est pas timide et ne se soucie pas de savoir qui ou combien de personnes s'y réfèrent.

  • Comment supprimer les dépendances en cascade?

See the documentation about cascading deletes

1

Vous ne pouvez pas affecter un modèle comme un champ d'un autre modèle. Ça ne marche pas comme ça. En dehors de toute autre chose, il y a tout un tas de magie métaclasse qui transforme les déclarations de champs au niveau du modèle en attributs au niveau de l'instance, et qui ne fonctionnera tout simplement pas avec un modèle comme vous l'avez essayé avec CustomProperySet.

Je ne peux pas vraiment comprendre ce que vous essayez de faire, de toute façon. Si vous voulez des données supplémentaires dans votre classe de profil, il suffit de l'ajouter - si vous voulez que la structure de ces données soit partagée avec d'autres classes, peut-être que le sous-classement serait utile.

Questions connexes