Как именно я должен использовать HStoreField?
Я использую последнюю версию Django и DRF. Но после запуска я получаю эту ошибку:
Класс HStoreDescriptor(models.fields.subclassing.Creator): AttributeError: модуль 'django.db.models.fields' не имеет атрибута 'наследование'
Я не уверен, как использовать HStoreField и создать расширение с помощью миграции. Это моя структура файла.
webhook10/
|-- tutorial/
| |-- slack/
| | |-- migrations/
| | | +-- __init__.py
| | |-- __init__.py
| | |-- admin.py
| | |-- apps.py
| | |-- models.py
| | |-- tests.py
| | |-- urls.py
| | +-- views.py
| |-- tutorial/
| | |-- __init__.py
| | |-- settings.py
| | |-- urls.py
| | |-- wsgi.py
| +-- manage.py
+-- venv/
Models.py
from django.db import models
from django.utils import timezone
from django_hstore import hstore
class WebhookTransaction(models.Model):
UNPROCESSED = 1
PROCESSED = 2
ERROR = 3
STATUSES = (
(UNPROCESSED, 'Unprocessed'),
(PROCESSED, 'Processed'),
(ERROR, 'Error'),
)
date_generated = models.DateTimeField()
date_received = models.DateTimeField(default=timezone.now)
body = hstore.SerializedDictionaryField()
request_meta = hstore.SerializedDictionaryField()
status = models.CharField(max_length=250, choices=STATUSES, default=UNPROCESSED)
objects = hstore.HStoreManager()
def __unicode__(self):
return u'{0}'.format(self.date_event_generated)
class Message(models.Model):
date_processed = models.DateTimeField(default=timezone.now)
webhook_transaction = models.OneToOneField(WebhookTransaction)
team_id = models.CharField(max_length=250)
team_domain = models.CharField(max_length=250)
channel_id = models.CharField(max_length=250)
channel_name = models.CharField(max_length=250)
user_id = models.CharField(max_length=250)
user_name = models.CharField(max_length=250)
text = models.TextField()
trigger_word = models.CharField(max_length=250)
def __unicode__(self):
return u'{}'.format(self.user_name)
serializers.py
from rest_framework import serializers
from slack.models import WebhookTransaction, Message
class WebhookTransactionSerializer(serializers.ModelSerializer):
class Meta:
model = WebhookTransaction
fields = '_all_'
class MessageSerializer(serializers.ModelSerializer):
class Meta:
model = Message
fields = '_all_'
Скажите, пожалуйста, какие изменения я могу сделать? Если вы хотите больше информации, пожалуйста, спросите.
1 ответ
- добавлять
'django.contrib.postgres'
в вашем INSTALLED_APPS. Подключите Postgresql и создайте расширение hstore:
sudo su - postgres \c database; CREATE EXTENSION IF NOT EXISTS hstore;
В вашем models.py:
from django.contrib.postgres.fields import HStoreField class Section(models.Model): title = models.CharField(max_length=256) parameters = HStoreField(blank=True,null=True)
Выполните следующие команды на терминале:
python manage.py makemigrations python manage.py migrate
По умолчанию он дает вам некрасивую текстовую область для записи пар ключ-значение json. Если вам нравится модный виджет hstore, вы можете установить его:
pip install django-admin-hstore-widget
.- Добавьте django_admin_hstore_widget в INSTALLED_APPS (в settings.py)
- Затем в admin.py вашего приложения добавьте это.
из раздела импорта your_app.models
из форм импорта django
из django_admin_hstore_widget.forms импортировать HStoreFormField
class SectionAdminForm(forms.ModelForm): parameters= HStoreFormField() class Meta: model = Section exclude = () @admin.register(Section) class SectionAdmin(admin.ModelAdmin): form = SectionAdminForm
Вам не нужно импортировать django_hstore
добавлять 'django.contrib.postgres'
в вашем INSTALLED_APPS.
Если hstrone не включен в Postgres, запустите скрипт sql: CREATE EXTENSION IF NOT EXISTS hstore
На модели: Добавить: from django.contrib.postgres.fields import HStoreField
Добавить поле: objects = HStoreField()