Django Модель Дизайн для вложенных Json Выход - PullRequest
0 голосов
/ 04 февраля 2020

Я хотел бы разработать модели для получения json вывода, как показано ниже. Я пробовал разные альтернативы, используя поля внешнего ключа или многие другие, но не смог заставить его работать.

Это то, что я хочу получить. У каждого пользователя могут быть разные тренинги, и у каждого тренинга для субъекта может быть более одной даты.

{"userid": "12345", "username": "John", "trainings": {"trn1 ": [" 20-01-2018 "]," trn2 ": [" 20-01-2018 "," 20-01-2019 "]," trn3 ": [" 20-01-2018 "," 20- 01-2019 "," 15-04-2019 "]}," notes ":" заметка о пользователе "}

1 Ответ

0 голосов
/ 04 февраля 2020

В зависимости от базы данных, которую вы используете. Postgres может использовать ArrayField для хранения списка дат. Если вы используете любую другую БД, вам понадобится дополнительная модель для дат или сохранить их как список JSON в TextField. Вот оба варианта:

С Postgres:

class User(models.Model):
    userid = models.CharField()
    username = models.CharField()


class Training(models.Model):
    trainingid = models.CharField()
    user = models.ForeignKey(
        User,
        on_delete=models.CASCADE,
        related_name='trainings',
    )
    dates = ArrayField(
        models.DateField()
    )

С другими БД:

class User(models.Model):
    userid = models.CharField()
    username = models.CharField()


class Training(models.Model):
    trainingid = models.CharField()
    user = models.ForeignKey(
        User,
        on_delete=models.CASCADE,
        related_name='trainings',
    )

class Date(models.Model):
    date = models.DateField()
    training = models.ForeignKey(
        Training,
        on_delete=models.CASCADE,
        related_name='dates',
    )

Вот как воссоздать ваш json объект для любого Опция БД:

users = []
for user in User.objects.all():
    current_user = {
        'userid': user.userid,
        'username': user.username,
        'trainings': {}
    }
    for training in user.trainings:
        current_user['trainings'][training.trainingid] = []
        for date in training.dates:
            current_user['trainings'][training.trainingid].append(date.date)
    users.append(current_user)

json_users = json.dumps(users)
...