2009-08-15 6 views
0

J'ai une table de style pour identifier un numéro de modèle pour chaque type de produit:Comment résoudre MySQL et Django d'administration étrangères contrainte de clé

class Style(models.Model): 
    style = models.AutoField(primary_key=True) 
    name = models.CharField('Title', max_length=150) 
etc.. 

Et je besoin d'une table de produit qui identifie toutes les variations du produit de la Cependant, le client veut être en mesure de suggérer d'autres produits qui vont avec le style mentionné ci-dessus. J'ai donc voulu ajouter quelques colonnes "produit apparenté" en tant que clé étrangère. Mais ni MySQL ni Django ne me permettent de les ajouter.

Donc pour l'instant je leur ai juste fait des champs entiers. J'ai ajouté ci-dessous des lignes au modèle Style:

related_1 = models.IntegerField('Related Product1',blank=True,max_length=10, default=0) 
    related_2 etc.. 

Par exemple, un polo a un styleId = 1.
Il a 4 couleurs différentes et 3 tissus.
7 produits au total pour 1 style.

La table des produits comportera sept lignes avec un ID de style = 1.

Le vendeur, parce que chaque produit a sélectionner manuellement les produits qui sont liés au style, qui vont dans related_1, related_2 etc.

Je comprends Django et MySQL considère-il une logique circulaire potentielle d'une FK à un styleId . Donc, si styleId a une clé étrangère dans le même produit, des conflits peuvent se produire.

Mais en fait, vous ne voulez évidemment pas permettre aux produits liés de référencer un produit avec le même styleId ... qui peut facilement être géré par l'application plutôt que par la base de données. Ma solution de contournement permet à l'utilisateur de saisir manuellement les produits associés dans le formulaire, mais ce serait vraiment génial si je pouvais faire en sorte que Django fasse une liste déroulante avec une liste d'identifiants de produits valides. Si possible.

Est-ce?

P.S. J'ai lu les docs django sur related_field mais je ne pouvais pas vraiment suivre ce qu'ils voulaient. J'ai essayé quelques choses, mais ils n'ont pas fourni beaucoup de code d'exemple.

2e P.S. Je l'ai édité par demande w/informations de modèle plus détaillées. J'espère que c'est plus clair maintenant ...

Répondre

0

Comme chacune de vos tables doit être décrite comme un modèle django, il serait utile que vous ayez directement posté les définitions de modèles plutôt que les descriptions de tables ci-dessus. Je sens que c'est là que réside votre vrai problème. Dans Django, vous devez généralement d'abord définir un style, puis définir les produits associant chacun d'entre eux avec un style.Quelque chose comme ceci:

style1 = Style.objects.create(styleId=1, name='jacket') 

Product.objects.create(productId=1, Name='bob', 
    Color='blue', Fabric='denim', styleId=style1) 
Product.objects.create(productId=2, Name='sam', 
    Color='red', Fabric='denim', styleId=style1) 

Vous pouvez alors accéder au style d'un produit donné comme ceci:

product1 = Product.objects.get(pk=1) 
product1.styleId.name 

Ou tous les produits d'un style donné comme ceci:

style1 = Style.objects.get(pk=1) 
style1.styleid_set.all() 
+0

Merci. Je suis django newbie seulement en utilisant admin, donc je ne suis pas vraiment familier avec cette syntaxe. Laisse-moi sortir ce que j'ai et éditer le post original. – joedevon

1

Vous ne devriez pas vouloir créer la structure que vous décrivez. Cela viole un certain nombre de principes de données relationnelles. Vous pouvez trouver les produits pour le style # 1 en interrogeant la table des produits. Qu'espérez-vous accomplir en structurant les choses de cette façon?

C'est une mauvaise idée de dupliquer les informations sur les produits qui vont avec quels styles dans la table de styles (ou toute autre table). Il vous oblige à mettre à jour les données dans plus d'un endroit chaque fois que vous ajoutez un nouveau produit ou modifiez le style d'un produit.

Il existe une mauvaise "odeur relationnelle" (appelée "groupes répétitifs") lorsque vous avez plusieurs colonnes dans le même tableau qui signifient la même chose, à l'exception du chiffre final sur le nom de la colonne. Combien de colonnes pour related_product allez-vous mettre dans votre table? Cela ne limite-t-il pas le nombre de produits pouvant impliquer le même style? Que faire si le produit associé à related_product2 est supprimé. Ferez-vous quelque chose pour déplacer l'une des autres valeurs related_productN dans related_product2, ou laisserez-vous simplement un trou dans la liste des valeurs?

Comment utiliseriez-vous l'information dans ce format pour voir si un produit est impliqué dans un style particulier? Vous auriez besoin de localiser ces styles où related_product1 = cherché_produit OU related_product2 = cherché_produit OU ....

Comme avec presque toutes les questions, une réponse valable est "qu'est-ce que vous essayez vraiment d'accomplir?" Je dis que ce que vous dites vouloir faire, vous ne voulez pas le faire, pour plusieurs raisons. Pouvez-vous dire ce que vous devez faire pour que cela soit plus facile avec la structure que vous mentionnez? {whichhand} a montré ce que vous pouvez faire dans Django sans dupliquer les informations sur la relation produit/style.

+0

J'essaie de faire ce que beaucoup de magasins de commerce électronique font. Sur la page de détail du produit, autorisez le fournisseur à lister les produits associés. Voici un exemple décent: http://bit.ly/2Q85Ez Ils ont un numéro de modèle pour le pull. Plusieurs couleurs Et vers le bas "Vous pouvez aussi aimer" avec 3 produits connexes. Je ne duplique pas les informations dans la table de style. Je ne fais que pointer vers des produits connexes. Mon code gère déjà les trous dans la table. Pas de vignette, pas d'affichage. Mais si vous avez une meilleure structure de table, je suis ouvert à apprendre quelque chose de nouveau. Tx. – joedevon

+0

Drôle comment vos outils peuvent changer votre paradigme. J'ai commencé à réfléchir à la façon dont je structurerais ceci si je n'étais pas débutant avec Django et je me suis rendu compte que je n'aurais même pas pensé à un related_1,2,3. J'aurais fait une table croisée. Mais je ne sais pas comment faire pour que Django fasse une sélection de produits à partir d'un croisement. – joedevon

Questions connexes