Bienvenue sur IndexError.

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

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

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

Django modèle et signaux.

0 votes

Bonjour a tous,
J'utilise Django pour des petits projets habituellement. Mais cette fois je m'attaque a un gros morceau et une question me taraude.
D'habitude je met mes models et les reciever des signaux pré et post save dans un seul fichier. Je fais ceci car cela pose rapidement des problème d'import cyclique de spliter tous ça.
Dans ce projet je vais avoir besoin de pas mal de models et quelques signaux.
Le fichier models.py va devenir illisible.
Auriez vous une astuce pour spliter tous ça dans n fichiers correctement ?

Lollo.

demandé 27-Oct par lollo (164 points)

2 Réponses

+1 vote

A la plqce du classuque models.py On fait un dossier models avec un __init__.py dedans et du coup on peut faire un module par model qu'on importera tranquillement

from foobar.models.nom_moduleA import ModelA

Exemple https://github.com/push-things/django-th/tree/master/django_th/models

répondu 27-Oct par foxmask (2,874 points)

Merci pour ta réponse,
Je teste ca de suite.
Dans models.nmmoduleA, si j'ai une foreigKey, je devrai faire un import.
from foobar.models.nom_moduleB import ModelB
et eventuelement dans le sens opposé aussi. ( exemple connu du capitaine d'une équipe)
Donc il faut privilégier les tables de relation dans se genre de situation?

C'est en fonction des besoins de chacun

0 votes

Salut,

Le mieux est effectivement de mettre en place un package models avec tes models groupés par fonctionnalité. De plus, tu dois faire l'import de ces models dans le init.py:

$ cat models/__init__.py
import logging
...
from .use import MyUseCaseModel, MyLinkedModel
...
$ cat models/use.py
import logging
from django.db import models
...

class MyLinkedModel(models.Model):
    label = models.CharField(max_length=255)


class MyUseCaseModel(models.Model):
    ...
    linked = models.ForeignKey("app.MyLinkedModel", related_name="use_cases", on_delete=models.CASCADE)
    ...

Note que je ne fais jamais d'appels directs à la classe dans les m2m et les fk, mais des références sous la forme "app.Model", je laisse django faire les imports à ma place. Je ne suis pas sûr, mais je crois que tous les models doivent être importés dans le models/__init__.py

Pour les signaux, je les inclu dans un module signals.py placé à la racine de l'app, et chargé avec la method ready de l'AppConf.

répondu 3-Nov par frague (588 points)
...