Multiples valeurs pour un attribut

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

Bonjours tout le monde, je viens demander votre aide car dans le cadre d'un projet je doit réaliser une application web et connaissant python, je me suis dis pourquoi pas tester Django, mais le soucie c'est que je ne sais pas et je n'ai pas trouver comment permettre a un attribut d'avoir plusieurs valeur( plus précisément dans mon cas les attributs de Specfiles ), si quel qu'un pourrait m'expliquer comment procéder je lui en serais très reconnaissant :).

voici mon fichier models.py :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
from django.db import models

# Create your models here.

class Comment(models.Model):

    experimental_hutch = models.CharField(max_length = 50)
    sample_holder = models.CharField(max_length = 50)
    evaporator = models.CharField(max_length = 50)
    t_range = models.CharField(max_length = 50)
    gasses = models.CharField(max_length = 50)
    type_of_sample = models.CharField(max_length = 50)

    class Meta:
        abstract = True

class Specfiles(models.Model):

    sixc = models.CharField(max_length = 50)
    optics = models.CharField(max_length = 50)
    kb = models.CharField(max_length = 50)
    other = models.CharField(max_length = 50)

    class Meta:
        abstract = True

class Experiment(Comment,Specfiles):
    experiment_id = models.CharField(max_length = 50, primary_key=True)
    name_proposer = models.CharField(max_length = 50)
    proposal = models.CharField(max_length = 300)
    folder = models.CharField(max_length = 300)
    image_folder = models.CharField(max_length = 300)
    date = models.DateField(auto_now = False, auto_now_add = False)


    def __str__(self):
        return self.experiment_id

Si je comprend bien ton besoin, tu aimerais que l'attribut optics par exemple puisse contenir une sorte de liste de CharField ?

Pour en arriver là tu as deux solutions possible avec Django :

Une classe dédiée

Il s'agit de faire une classe dédiée Optic qui ressemble à ça :

1
2
class Optic(models.Model):
     title = models.CharField(max_length = 50)

puis tu modifie ta classe Specfiles dans ce sens

1
2
3
4
5
6
7
8
9
class Specfiles(models.Model):

    sixc = models.CharField(max_length = 50)
    optics = models.ManyToManyField(Optic)
    kb = models.CharField(max_length = 50)
    other = models.CharField(max_length = 50)

    class Meta:
        abstract = True

La technique qui ne fonctionne que avec PostgreSQL

Utiliser le type ArrayField de django qui fonctionne comme la solution précédente, mais sans avoir besoin d'écrire explicitement ta classe.

Le souci évidemment est que tu ne pourra pas utiliser autre chose que PostgreSQL avec cette technique.

A choisir je partirai sur la première solution

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