Как именно я должен использовать 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 ответ

  1. добавлять 'django.contrib.postgres'в вашем INSTALLED_APPS.
  2. Подключите Postgresql и создайте расширение hstore:

    sudo su - postgres \c database; CREATE EXTENSION IF NOT EXISTS hstore;

  3. В вашем 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)

  4. Выполните следующие команды на терминале:

    python manage.py makemigrations python manage.py migrate

  5. По умолчанию он дает вам некрасивую текстовую область для записи пар ключ-значение json. Если вам нравится модный виджет hstore, вы можете установить его:

    1. pip install django-admin-hstore-widget.
    2. Добавьте django_admin_hstore_widget в INSTALLED_APPS (в settings.py)
    3. Затем в 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()

документы

Другие вопросы по тегам