Сделать список элементов атрибутом таблицы «Группа», где элементы являются записями (кортежами) таблицы «Этудиант» - PullRequest
1 голос
/ 02 апреля 2019

Я создаю базу данных, в которой одним из атрибутов одной таблицы должен быть список кортежей (записей) из другой таблицы.У меня есть таблица "Этудиант" и таблица "Группа" в моем файле.Как это сделать, пожалуйста?

Вот выдержка из кода, содержащего соответствующие таблицы.

from django.db import models;
from django.contrib.auth.models import User;
from django.utils import timezone;


# Table qui stockera les groupes aux quelles les étudiants appartiennent
class Groupe(models.Model):

    numero_groupe       = models.IntegerField();
    nombre_de_membre    = models.IntegerField();
    liste_etudiant      = ; # Here an students list;
    chef_de_groupe_tp   = models.CharField(max_length=100);
    ue                  = models.ForeignKey(UE, on_delete=models.PROTECT); 
    date_creation       = models.DateTimeField(default=timezone.now, verbose_name="Date de création");

    class Meta:
        verbose_name    = "groupe";
        ordering        = ['date'];

    def __str__(self):
        info_groupe     = ue.code_ue + " : "  numero_groupe;

        return self.info_groupe;


# Table qui stockera les informations concernant les étudiants
class Etudiant(models.Model):

    matricule_etudiant      = models.CharField(max_length=10);
    user                    = models.OneToOneField(User); # étudiant a désormais les attributs de User.
    niveau                  = models.CharField(max_length=10);
    avatar                  = models.ImageField(null=True, blank=True, upload_to="avatar/etudiant/");
    td                      = models.ManyToManyField(TD, through='Note_TD');
    tp                      = models.ManyToManyField(TP, through='Note_TP');

    class Meta:
        verbose_name        = "étudiant";
        ordering            = ['matricule_etudiant'];

    def __str__(self):
        info_etudiant       = matricule_etudiant + " " + user.last_name + " " + user.firstname + " " + niveau;

        return self.info_etudiant;

1 Ответ

1 голос
/ 02 апреля 2019

Насколько я знаю, в django нет ListField.Если вы используете postgres в качестве базы данных, вы можете использовать ArrayField из django.contrib.postgres.fields.В противном случае вы можете использовать решение, указанное ниже, но оно имеет свои ограничения.(Вы не можете запрашивать как обычное поле).

import json

class Groupe(models.Model):
    _liste_etudiant = models.TextField()

    @property
    def liste_etudiant(self):
        return json.loads(self._liste_etudiant)

    @property.setter
    def liste_etudiant(self, value):
        self._liste_etudiant = json.dumps(value)

Или вы можете использовать JsonField из django.contrib.postgres.fields при использовании postgres.В этом случае вы также можете запросить это поле.

...