如何在django模型中存储对象?

如何在django模型中存储对象?,django,django-models,django-database,Django,Django Models,Django Database,我从前端接收一个对象作为参数和其他参数。如何将该对象存储到模型中 我试过JSONfield,但不确定这是否是最好的方法。这将是一个像Mixpanel一样的跟踪服务 这大致就是前端中的对象: myObj = { context: ["Home Page"] dropDown: "navigated to main screen" side: "creator-side" withSelection: false } 我想把它放在Django: @reversion.register() 类跟踪事

我从前端接收一个对象作为参数和其他参数。如何将该对象存储到模型中

我试过JSONfield,但不确定这是否是最好的方法。这将是一个像Mixpanel一样的跟踪服务

这大致就是前端中的对象:

myObj = {
context: ["Home Page"]
dropDown: "navigated to main screen"
side: "creator-side"
withSelection: false
}
我想把它放在Django:

@reversion.register()
类跟踪事件(models.Model):
...
event_name=models.TextField(最大长度=250,null=True,blank=True)
已创建\u at=models.DateTimeField(自动\u now\u add=True)
myObj={在这里添加什么}

我希望能够根据“管理”面板上对象中的属性筛选事件。

如果您使用的是PostgreSQL,则可以利用创建一个存储结构化JSON对象的模型字段。然后,您可以在Django管理员中添加一个自定义过滤器来查询JSON

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
因此,您可以在admin.py中像这样使用自定义筛选器(例如,对于
属性)


您使用的是什么DBMS?@mrzrm postgresql还有一个问题,我应该将此筛选器保存在admin.py还是定义模型的位置?@NaimMustafa我建议您将
SideFilter
TrackedEventsAdmin
存储在应用程序的admin.py中,但将
jsonfilter
保存在存储实用程序的更通用位置;因为其他应用程序可能会使用它。
class SideFilter(JSONFieldFilter):
    title = 'Side'
    parameter_name = 'side'
    json_field_name = 'detail'
    json_field_property_name = 'side'


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