Создание поля массива в Django - PullRequest
2 голосов
/ 28 июня 2011

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

Ответы [ 5 ]

1 голос
/ 08 марта 2015

Django 1.8 поддерживает ArrayField тип , специфичный для PostgreSQL.

from django.db import models
from django.contrib.postgres.fields import ArrayField

class ChessBoard(models.Model):
    board = ArrayField(
        ArrayField(
            models.CharField(max_length=10, blank=True),
            size=8,
        ),
        size=8,
    )
0 голосов
/ 22 января 2019

Я знаю, что это кажется нелогичным, но вы определенно хотите использовать что-то общее, например, многие к одному (внешний ключ), из таблицы ответов в таблицу опроса.Вы хотите, чтобы ваше приложение легко развивалось, чтобы поддерживать будущие идеи, например, связывать метаданные с этими парами ответов на запросы и иметь возможность эффективно выполнять запросы к этим метаданным, например, что люди в Портленде отвечают на этот вопрос.

Если вы действительно хотите использовать простую, очень простую схему БД, просто создайте массив pks.Но не поддавайтесь искушению использовать ArrayField только для postgres.Если вы хотите, чтобы ваши модели Django работали с бэкэндами, отличными от postgres (MySQL, MariaDB или sqlite), вам нужно хранить массив как сериализацию строк.Самый простой формат - это строка json, но подойдет все, даже csv.

0 голосов
/ 31 декабря 2018

Я знаю, что это не дает прямого ответа на вопрос, но я запросил "django create default arrayfield" и получил здесь.

Итак, вот пример создания ArrayField со значением по умолчанию:

from django.contrib.postgres.fields import ArrayField

def default_thing():
    return ['THIS IS A DEFAULT']

class SomeModel(ParentModel):
    thing_to_export = ArrayField(models.CharField(max_length=50), 
                                 default=default_thing)
0 голосов
/ 28 июня 2011

Мы используем django-auditlog, чтобы делать то, что Django записывает изменения через администратора. https://github.com/Atomidata/django-audit-log Реализуется просто путем указания любой модели, подлежащей аудиту.

class MyClass(models.Model):
    field1 = models.CharField(max_length=100, blank=True, db_index=True, null=True)
    field2 = models.BooleanField(blank=False,null=False,default=True)

    audit_log = AuditLog()
0 голосов
/ 28 июня 2011

Если вы просто хотите сохранить предыдущие версии ваших моделей, вы можете использовать django-reversion , который может добавлять средства контроля версий в модели Django (позволяя сохранять ревизии, изменения отката и т. Д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...