Сохраните простые пользовательские настройки в Python

Итак, я предполагаю, что в вашем 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)
7
задан 4 revs, 2 users 80% 17 April 2015 в 22:35
поделиться

12 ответов

Используя cPickle на словаре был бы мой выбор. Словари являются естественным пригодным для подобных данных, так, учитывая Ваши требования я не вижу оснований для не использования их. Это, если Вы не думаете о чтении их из приложений не-Python, в этом случае необходимо было бы использовать язык нейтральный текстовый формат. И даже здесь Вам мог сойти с рук рассол плюс инструмент экспорта.

7
ответ дан 6 December 2019 в 05:39
поделиться

Я использовал бы модуль 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 для хорошего краткого изложения основ.

9
ответ дан 6 December 2019 в 05:39
поделиться

Я не занимаюсь вопросом, какой является лучшим. Если бы Вы хотите обработать текстовые файлы, я рассмотрел бы ConfigParser - модуль. Другой, которого Вы могли дать попытке, будет simplejson или yaml. Вы могли также рассмотреть реальную таблицу базы данных.

Например, у Вас могла быть таблица, названная userattrs с тремя столбцами:

  • Интервал user_id
  • Строка attribute_name
  • Строка attribute_value

Если существуют только немногие, Вы могли бы сохранить их в cookie для быстрого извлечения.

6
ответ дан 6 December 2019 в 05:39
поделиться

Вот самый простой путь. Используйте простые переменные и import файл настроек.

Назовите файл userprefs.py

# a user prefs file
color = 0x010203
font = "times new roman"
position = ( 12, 13 )
size = ( 640, 480 )

В Вашем приложении необходимо быть уверены, что можно импортировать этот файл. У Вас есть много вариантов.

  1. Используя PYTHONPATH. Потребовать PYTHONPATH будьте установлены включать каталог с предпочтительными файлами.

    a. Явный параметр командной строки для именования файла (не лучшее, но простой)

    b. Переменная среды для именования файла.

  2. Расширение sys.path включать корневой каталог пользователя

Пример

import sys
import os
sys.path.insert(0,os.path.expanduser("~"))
import userprefs 
print userprefs.color
4
ответ дан 6 December 2019 в 05:39
поделиться

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

Если Вы не заботитесь о человекочитаемых форматах, то pickle простой и простой способ пойти. Я также услышал хорошие отчеты о simplejson.

Если человеческая удобочитаемость важна, две простых опции представляют себя:

Модуль: Просто используйте модуль. Если все, в чем Вы нуждаетесь, является несколькими globals, и ничто не полагает, то это - способ пойти. Если бы Вы действительно стали отчаянными, то Вы могли бы определить классы и переменные класса для эмуляции разделов. Оборотная сторона здесь: если файл будет отредактирован рукой пользователем, ошибки могло бы быть трудно зафиксировать и отладить.

Формат INI: я использовал ConfigObj для этого с довольно мало успеха. ConfigObj является по существу заменой для ConfigParser с поддержкой вложенных разделов и многое другое. Дополнительно, можно определить ожидаемые типы или значения для файла и проверить его, обеспечив систему поддержки (и важная ошибочная обратная связь) для пользователей/администраторов.

3
ответ дан 6 December 2019 в 05:39
поделиться

Я использовал бы, откладывают или sqlite база данных, если я должен был бы сохранить их устанавливающие в файловой системе. Хотя, так как Вы создаете веб-сайт, Вы, вероятно, используете некоторую базу данных итак, почему не просто используют это?

2
ответ дан 6 December 2019 в 05:39
поделиться

Встроенный sqlite3 модуль, вероятно, был бы намного более простым, чем большинство альтернатив и готовит, Вы для обновления к полному RDBMS должны Вы когда-либо хотеть или должными быть.

2
ответ дан 6 December 2019 в 05:39
поделиться

Если человеческая удобочитаемость вопросов configfiles, альтернатива могла бы быть модулем ConfigParser, который позволяет Вам читать и писать .ini как файлы. Но затем Вы ограничиваетесь одним уровнем вложенности.

1
ответ дан 6 December 2019 в 05:39
поделиться

Если у Вас есть база данных, я мог бы предложить хранить настройки в базе данных. Однако это кажется, что обычные файлы могли бы удовлетворить Вашей среде лучше.

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

Соление является разумным способом хранить такие данные, но к сожалению формат данных рассола известно not-human-readable. Вы могли бы быть более обеспеченным хранением его как repr(dictionary) который будет более читаемым форматом. Для перезагрузки пользовательских настроек использовать eval(open("file").read()) или что-то как этот.

0
ответ дан 6 December 2019 в 05:39
поделиться

Есть ли существует конкретная причина, Вы не используете базу данных для этого? кажется, что нормальная и естественная вещь сделать - или сохранить рассол настроек в дб включила идентификатор пользователя или что-то.

Вы не описали шаблоны использования веб-сайта, но просто размышление об общем веб-сайте - но я думал бы, что хранение настроек в базе данных вызовет намного меньше диска ввод-вывод, чем использование файлов.

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

0
ответ дан 6 December 2019 в 05:39
поделиться

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

0
ответ дан 6 December 2019 в 05:39
поделиться

Если Вы не заботитесь о способности отредактировать файл сами и хотеть быстрый способ сохранить объекты Python, пойдите с рассолом. Если Вы действительно хотите, чтобы файл был читаем человеком или читаем некоторым другим приложением, используйте ConfigParser. При необходимости в чем-либо более сложном пойдите со своего рода базой данных, будьте ею реляционный (sqlite), или объектно-ориентированный (аксиома, zodb).

0
ответ дан 6 December 2019 в 05:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: