Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Contrainte unique sur plusieurs colonnes d'une table

0 votes

Je débute avec django, et j'ai vraiment du mal à ne pas gérer moi-même mes requêtes sql et le modèle de mes tables.

J'ai une simple table de relations entre une table articles et une table catégories.

class ArticlesCategories(models.Model):
    cat_id = models.ForeignKey(Categories, on_delete=models.DO_NOTHING)
    art_id = models.ForeignKey(Articles, on_delete=models.DO_NOTHING)
    class Meta:
        unique_together = ('cat_id', 'art_id')

De ce modèle, je m'attendais donc à pouvoir insérer dans cette table des entiers.

artcat = ArticlesCategories()
artcat.art_id = 10
artcat.cat_id = 2

Et à récupérer une erreur de contrainte d'unicité au cas où cette entrée existe déjà dans la table.

Sauf que django râle parce qu'il veut des objets.

Cannot assign "2": "ArticlesCategories.cat_id" must be a "Categories"
instance.

De plus si je visionne le schéma de la table générée, il n'y a aucun unique sur les 2 colonnes, wtf !

On va quand même se prendre la tête à construire des models uniquement pour faire de simples insertions parce qu'en fait le schéma des tables générées est tellement à chier qu'on se demande à quoi ça sert que django s'en mêle.

Y a-t-il une autre façon de faire en utilisant de simples entiers ?
Pourquoi django ne créé pas un unique dans la table sql plutôt que si j'ai bien compris de faire cette vérification en interne ?

demandé 20-Dec-2019 par anonyme

1 Réponse

0 votes

Pour que l'orm fasse son boulot il te demande d'instancié une Categorie, pour qu'il récupère son id et la propage, ce serait la meilleur méthode car tu serais sûr que l'id existe.

tu peux effectivement passé un id sans instancié Categorie, mais l'attribut de champ en base générer par django sur le modèle ArticlesCategories n'est pas catid mais de mémoire catid_id du coup.
vérifie en base le nom dans la table, et la cela passera sans problème.
tu peux même faire un dir(artcat)..

j'espère t'avoir aidé.

répondu 7-Fev par bidochon (210 points)
...