Как сохранить объект в модели Django? - PullRequest
0 голосов
/ 07 июня 2019

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

Я пробовал JSONfield, но не уверен, что это лучший способ сделать это.Это будет служба отслеживания, например Mixpanel

, примерно так выглядит объект во внешнем интерфейсе:

myObj = {
context: ["Home Page"]
dropDown: "navigated to main screen"
side: "creator-side"
withSelection: false
}

, и я хочу иметь ее в Django:

@reversion.register()
class TrackedEvents(models.Model):
    ...
    event_name = models.TextField(max_length=250, null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    myObj = { what to add here }

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

1 Ответ

1 голос
/ 07 июня 2019

Если вы используете PostgreSQL , вы можете воспользоваться типом поля Django JSONField для создания поля модели, в котором хранится структурированный объект JSON . Затем вы можете добавить пользовательский фильтр для запроса по JSON в админке Django.

admin.py

from django.contrib.postgres.fields import JSONField

class TrackedEvents(models.Model):
    event_name = models.TextField(max_length=250, null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    detail = JSONField()

Пользовательский фильтр

from django.contrib.admin import SimpleListFilter

class JSONFieldFilter(SimpleListFilter):
    def __init__(self, *args, **kwargs):
        super(JSONFieldFilter, self).__init__(*args, **kwargs)
        assert hasattr(self, 'title'), (
            'Class {} missing "title" attribute'.format(self.__class__.__name__)
        )
        assert hasattr(self, 'parameter_name'), (
            'Class {} missing "parameter_name" attribute'.format(self.__class__.__name__)
        )
        assert hasattr(self, 'json_field_name'), (
            'Class {} missing "json_field_name" attribute'.format(self.__class__.__name__)
        )
        assert hasattr(self, 'json_field_property_name'), (
            'Class {} missing "json_field_property_name" attribute'.format(self.__class__.__name__)
        )

    def lookups(self, request, model_admin):
        values_list = map(
            lambda data: data[self.json_field_property_name],
            model_admin.model.objects.values_list(self.json_field_name, flat=True)
        )
        return [(v, v) for v in set(values_list)]

    def queryset(self, request, queryset):
        if self.value():
            key = "{}__{}".format(self.json_field_name, self.json_field_property_name)
            return queryset.filter(**{key: self.value()})
        return queryset

Таким образом, вы можете использовать собственный фильтр (например, для свойства side) в вашем admin.py .

class SideFilter(JSONFieldFilter):
    title = 'Side'
    parameter_name = 'side'
    json_field_name = 'detail'
    json_field_property_name = 'side'


 class TrackedEventsAdmin(admin.ModelAdmin):
    list_filter = [SideFilter]
...