1

Mon application a des clients qui ont chacun un profil de facturation unique.Django: Comment définir une relation de modèle pour obtenir ce qui suit?:

J'envisager mon application ayant un modèle « client » avec un attribut appelé « billing_profile » qui référence un autre modèle appelé « BillingProfile ». Plutôt que de définir "BillingProfile" avec une clé étrangère de nouveau à "Client" (ie, "client = models.ForeignKey (Client)"), je pensais que car il y aura seulement un profil de facturation pour chaque client qui Je pourrais simplement utiliser un champ un-à-un à la place. Cela semble-t-il logique, ou semble-t-il en arrière (alors je devrais créer un profil de facturation avant d'établir un client). Y a-t-il un bon moyen de le faire contre mon paradigme de compréhension?

Répondre

1

Je l'ai compris.

OneToOneField() peut être recherché dans les deux sens via la méthode de l'attribut simple.

Exemple:

Modèles:

class Client(models.Model): 
    ... stuff ... 


class BillingProfile(models.Model): 
    client = models.OneToOneField('Client') 
    ... stuff ... 

Maintenant, je peux faire l'une de ces:

spam_client.billingprofile # returns related BillingProfile Instance 

ou

spam_billingprofile.client # returns related Client instance 

Cela signifie que je n'ai pas instancier le BillingProfile jusqu'à ce que Je suis prêt, mais j'ai encore les avantages que j'aurais si le client avait un attribut de profil de facturation au lieu de l'inverse. En d'autres termes: je pensais tout à l'envers avant, mais pas trop à reculons.

2

C'est la façon de le faire, si vous êtes certain que c'est une relation un à un. par exemple, pourrait-il y avoir un client avec 2 profils de facturation: un pour un usage personnel et pour son entreprise, & c ...

Il n'est pas en arrière, car en utilisant un à un, ou en utilisant une clé étrangère n'affecte pas l'ordre de création (dans les deux cas, vous pouvez d'abord créer le profil, ou créer le client en premier, puis les lier).

+0

Merci Ofri. Comment puis-je créer un client sans l'attribut billing_profile (c'est-à-dire sans que BillingProfile ne soit créé) sauf A) J'ai utilisé blank = True (que je veux que tous les clients aient un profile de facturation) ou B) save (commit = False) Sur mon nouveau client, créez le profil de facturation et ajoutez-le au client, puis utilisez à nouveau save() sur le client. Est-ce que je pense à tout cela? – orokusaki

+0

Voici deux façons de le faire. d'autres idées peuvent être trouvées ici: http://stackoverflow.com/questions/1652550/can-django-automatically-create-a-related-one-to-one-model –

Questions connexes