Gérer ce type de relation

Le problème exposé dans ce sujet a été résolu.

Bonjour,

Tout d’abord, désolé pour le titre peu explicite, je n’ai pas trouvé mieux…

Je crée actuellement une application avec Django qui va servir à gérer des véhicules. À chacun est associé exactement trois documents, la carte grise, le contrôle technique et l’assurance. J’avais donc fait un modèle véhicule intégrant trois CharField pour pouvoir mettre le nom de l’image. Mais j’ai rapidement remarqué que j’allais avoir besoin de rajouter l’id de la personne qui a envoyé les images et quand est-ce qu’elles ont été envoyées. J’ai donc créé un modèle à part qui met permet de gérer toutes ces données liées à un document.

class Vehicle(models.Model):
    TYPE_CHOICES = (
        ('vpsp', 'VPSP'),
        ('vtp_6p', 'VTP-6P'),
        ('vtp_9p', 'VTP-9P')
    )

    type = models.CharField('type', max_length=6, choices=TYPE_CHOICES, default=TYPE_CHOICES[1][0])
    registration = models.CharField('immatriculation', max_length=9, unique=True)

    created_at = models.DateTimeField('créé le', auto_now=False, auto_now_add=True)
    updated_at = models.DateTimeField('modifié le', auto_now=True)

    class Meta:
        verbose_name = 'véhicule'

    def __str__(self):
        return '[{}] {}'.format(self.type, self.registration)


class Document(models.Model):
    REGISTRATION_CERTIFICATE = 'rc'
    TECHNICAL_CONTROL = 'tc'
    INSURANCE = 'in'

    TYPE_CHOICES = (
        (REGISTRATION_CERTIFICATE, 'Carte Grise'),
        (TECHNICAL_CONTROL, 'Contrôle technique'),
        (INSURANCE, 'Assurance')
    )

    name = models.CharField('nom', max_length=255)
    uploader = models.ForeignKey('user.User', on_delete=models.CASCADE, verbose_name='utilisateur')
    vehicle = models.ForeignKey('vehicle.Vehicle', on_delete=models.CASCADE, verbose_name='véhicule')
    uploaded_at = models.DateTimeField('envoyé le', auto_now=False, auto_now_add=False)

Mais j’ai un problème. Comment m’assurer que j’aurais toujours un seul exemplaire de chaque document pour un véhicule donné ? Comment m’assurer que l’utilisateur modifie bien le document actuel et qu’il n’en envoi pas un nouveau ?

Je vous remercie pour votre aide !

N’y aurait-il pas moyen de gérer cela avec le paramètre unique_together de Django (doc) ? Par ailleurs, ta variable TYPE_CHOICES du modèle Document n’est pas utilisée. ;)

+0 -0

Pourquoi tu ne crées pas plutôt trois modèles distincts, avec une relation OneToOne avec ton Vehicle ?

Quitte à ce qu’ils héritent d’une classe commune s’ils ont des propriétés en commun.

Theo

Parce que ça fait trois fois la même classe avec exactement les mêmes données, ça ne me semble pas très propre. Après si c’est ce qui se fait pourquoi pas. :)

N’y aurait-il pas moyen de gérer cela avec le paramètre unique_together de Django (doc) ?

rezemika

J’ai du mal à comprendre le fonctionnement. Le principe je pense l’avoir, les valeur du tuple précisées doivent être uniques ensemble, mais quelque chose m’échappe. Comment ça peut m’aider à résoudre mon problème ?

Par ailleurs, ta variable TYPE_CHOICES du modèle Document n’est pas utilisée. ;)

rezemika

J’ai fait un copié collé rapide, j’ai oublié cette ligne. :lol:

Merci pour vos réponses !

N’y aurait-il pas moyen de gérer cela avec le paramètre unique_together de Django (doc) ?

rezemika

J’ai du mal à comprendre le fonctionnement. Le principe je pense l’avoir, les valeur du tuple précisées doivent être uniques ensemble, mais quelque chose m’échappe. Comment ça peut m’aider à résoudre mon problème ?

Wizix

Je dirais que si les valeurs de Document.vehicle et Document.type (ou le nom que tu donne à la variable contenant une des valeurs de TYPE_CHOICES) sont uniques entre elles, alors il me semble qu’il ne pourra y avoir qu’un seul type de document enregistré par véhicule.

+0 -0

Pourquoi tu ne crées pas plutôt trois modèles distincts, avec une relation OneToOne avec ton Vehicle ?

Quitte à ce qu’ils héritent d’une classe commune s’ils ont des propriétés en commun.

Theo

Je suis finalement parti sur cette réponse qui me semble être la plus simple à mettre en place. Voici ce que j’ai obtenu :

class Document(models.Model):
    image = models.ImageField('image', upload_to='documents/')
    uploader = models.ForeignKey('user.User', on_delete=models.CASCADE, verbose_name='envoyeur')
    vehicle = models.OneToOneField('vehicle.Vehicle', on_delete=models.CASCADE, verbose_name='véhicule')
    uploaded_at = models.DateTimeField('envoyé le', auto_now=False, auto_now_add=False)

    class Meta:
        abstract = True


class GreyCard(Document):
    image = models.ImageField('image', upload_to='documents/grey_cards/')


class RegistrationCertificate(Document):
    image = models.ImageField('image', upload_to='documents/registration_certificates/')


class InsuranceCertificate(Document):
    image = models.ImageField('image', upload_to='documents/insurance_certificates/')

Merci pour votre aide !

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte