Итак, я предполагаю, что в вашем models.py
у вас есть модель с именем Song
. В модели Song
я предполагаю, что у вас есть поле song_name
или что-то подобное. В Song
добавьте:
class Meta:
ordering = ('song_name',)
Это упорядочит все наборы запросов Song
объектов в алфавитном порядке по их именам, включая экземпляр manytomany
вашего списка воспроизведения.
Если вы хотите заказать конкретно manytomany
, а не все наборы запросов Song, вам следует создать модель through
, например:
class PlaylistSong(models.Model):
playlist = models.ForeignKey(Playlist, on_delete=models.CASCADE)
song = models.ForeignKey(Song, on_delete=models.PROTECT)
class Meta:
ordering = ('song__song_name',)
Затем можно заменить [ 1112] поле в Playlist
с:
songs = models.ManyToManyField(Song, through='PlaylistSong', blank=True)
Используя cPickle на словаре был бы мой выбор. Словари являются естественным пригодным для подобных данных, так, учитывая Ваши требования я не вижу оснований для не использования их. Это, если Вы не думаете о чтении их из приложений не-Python, в этом случае необходимо было бы использовать язык нейтральный текстовый формат. И даже здесь Вам мог сойти с рук рассол плюс инструмент экспорта.
Я использовал бы модуль ConfigParser, который производит некоторый довольно читаемый и доступный для редактирования пользователем вывод для Вашего примера:
[bob] colour_scheme: blue british: yes [joe] color_scheme: that's 'color', silly! british: no
Следующий код произвел бы файл конфигурации выше и затем распечатал бы его:
import sys
from ConfigParser import *
c = ConfigParser()
c.add_section("bob")
c.set("bob", "colour_scheme", "blue")
c.set("bob", "british", str(True))
c.add_section("joe")
c.set("joe", "color_scheme", "that's 'color', silly!")
c.set("joe", "british", str(False))
c.write(sys.stdout) # this outputs the configuration to stdout
# you could put a file-handle here instead
for section in c.sections(): # this is how you read the options back in
print section
for option in c.options(section):
print "\t", option, "=", c.get(section, option)
print c.get("bob", "british") # To access the "british" attribute for bob directly
Обратите внимание, что ConfigParser только поддерживает строки, таким образом, необходимо будет преобразовать, как я имею выше для булевских переменных. См. effbot для хорошего краткого изложения основ.
Я не занимаюсь вопросом, какой является лучшим. Если бы Вы хотите обработать текстовые файлы, я рассмотрел бы ConfigParser - модуль. Другой, которого Вы могли дать попытке, будет simplejson или yaml. Вы могли также рассмотреть реальную таблицу базы данных.
Например, у Вас могла быть таблица, названная userattrs с тремя столбцами:
Если существуют только немногие, Вы могли бы сохранить их в cookie для быстрого извлечения.
Вот самый простой путь. Используйте простые переменные и import
файл настроек.
Назовите файл userprefs.py
# a user prefs file
color = 0x010203
font = "times new roman"
position = ( 12, 13 )
size = ( 640, 480 )
В Вашем приложении необходимо быть уверены, что можно импортировать этот файл. У Вас есть много вариантов.
Используя PYTHONPATH
. Потребовать PYTHONPATH
будьте установлены включать каталог с предпочтительными файлами.
a. Явный параметр командной строки для именования файла (не лучшее, но простой)
b. Переменная среды для именования файла.
Расширение sys.path
включать корневой каталог пользователя
Пример
import sys
import os
sys.path.insert(0,os.path.expanduser("~"))
import userprefs
print userprefs.color
Для управляемого базой данных веб-сайта, конечно, Вашим наилучшим вариантом является таблица базы данных. Я предполагаю, что Вы не делаете вещи базы данных.
Если Вы не заботитесь о человекочитаемых форматах, то pickle
простой и простой способ пойти. Я также услышал хорошие отчеты о simplejson
.
Если человеческая удобочитаемость важна, две простых опции представляют себя:
Модуль: Просто используйте модуль. Если все, в чем Вы нуждаетесь, является несколькими globals, и ничто не полагает, то это - способ пойти. Если бы Вы действительно стали отчаянными, то Вы могли бы определить классы и переменные класса для эмуляции разделов. Оборотная сторона здесь: если файл будет отредактирован рукой пользователем, ошибки могло бы быть трудно зафиксировать и отладить.
Формат INI: я использовал ConfigObj для этого с довольно мало успеха. ConfigObj является по существу заменой для ConfigParser с поддержкой вложенных разделов и многое другое. Дополнительно, можно определить ожидаемые типы или значения для файла и проверить его, обеспечив систему поддержки (и важная ошибочная обратная связь) для пользователей/администраторов.
Я использовал бы, откладывают или sqlite база данных, если я должен был бы сохранить их устанавливающие в файловой системе. Хотя, так как Вы создаете веб-сайт, Вы, вероятно, используете некоторую базу данных итак, почему не просто используют это?
Встроенный sqlite3 модуль, вероятно, был бы намного более простым, чем большинство альтернатив и готовит, Вы для обновления к полному RDBMS должны Вы когда-либо хотеть или должными быть.
Если человеческая удобочитаемость вопросов configfiles, альтернатива могла бы быть модулем ConfigParser, который позволяет Вам читать и писать .ini как файлы. Но затем Вы ограничиваетесь одним уровнем вложенности.
Если у Вас есть база данных, я мог бы предложить хранить настройки в базе данных. Однако это кажется, что обычные файлы могли бы удовлетворить Вашей среде лучше.
Вы, вероятно, не хотите хранить все пользовательские настройки в том же файле, потому что Вы могли бы столкнуться с проблемой с параллельным доступом к тому одному файлу. Если бы Вы сохранили настройки каждого пользователя как словарь в их собственном соленом файле, то они смогли бы действовать независимо.
Соление является разумным способом хранить такие данные, но к сожалению формат данных рассола известно not-human-readable. Вы могли бы быть более обеспеченным хранением его как repr(dictionary)
который будет более читаемым форматом. Для перезагрузки пользовательских настроек использовать eval(open("file").read())
или что-то как этот.
Есть ли существует конкретная причина, Вы не используете базу данных для этого? кажется, что нормальная и естественная вещь сделать - или сохранить рассол настроек в дб включила идентификатор пользователя или что-то.
Вы не описали шаблоны использования веб-сайта, но просто размышление об общем веб-сайте - но я думал бы, что хранение настроек в базе данных вызовет намного меньше диска ввод-вывод, чем использование файлов.
OTOH, для настроек, которые могли бы использоваться клиентским кодом, храня их как JavaScript в статическом файле, который может кэшироваться, был бы удобен - за счет наличия нескольких мест, у Вас могли бы быть настройки. (Я, вероятно, сохранил бы те настройки в дб и восстановил бы статические файлы по мере необходимости),
Я соглашаюсь с ответом об использовании Соленого Словаря. Очень простой и эффективный для того, чтобы хранить простые данные в структуре Словаря.
Если Вы не заботитесь о способности отредактировать файл сами и хотеть быстрый способ сохранить объекты Python, пойдите с рассолом. Если Вы действительно хотите, чтобы файл был читаем человеком или читаем некоторым другим приложением, используйте ConfigParser. При необходимости в чем-либо более сложном пойдите со своего рода базой данных, будьте ею реляционный (sqlite), или объектно-ориентированный (аксиома, zodb).