Как сохранить словарь на модели Django? - PullRequest
50 голосов
/ 31 декабря 2008

Мне нужно хранить некоторые данные в модели Django. Эти данные не равны всем экземплярам модели.

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

Я действительно чувствую, что словарь будет лучшим подходом, но в документации Django нет ничего о том, как сохранить словарь в модели Django (или я не могу его найти).

Есть какие-нибудь подсказки?

Ответы [ 13 ]

2 голосов
/ 31 декабря 2008

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

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

1 голос
/ 30 августа 2016

Если вы используете Postgres, вы можете использовать поле hstore: https://docs.djangoproject.com/en/1.10/ref/contrib/postgres/fields/#hstorefield.

0 голосов
/ 05 мая 2019

Я использую текстовое поле и json.loads() / json.dumps()

models.py

import json
from django.db import models

class Item(models.Model):
    data = models.TextField(blank=True, null=True, default='{}')

    def save(self, *args, **kwargs):
        ## load the current string and
        ## convert string to python dictionary
        data_dict = json.loads(self.data)

        ## do something with the dictionary
        for something in somethings:
            data_dict[something] = some_function(something)

        ## if it is empty, save it back to a '{}' string,
        ## if it is not empty, convert the dictionary back to a json string
        if not data_dict:
            self.data = '{}'
        else:
            self.data = json.dumps(data_dict)


        super(Item, self).save(*args, **kwargs)

...