我从前端收到一个对象作为参数以及其他参数。如何将该对象存储到模型中?
我已经尝试过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 }
我希望能够基于管理面板上对象中的属性来过滤事件。
答案 0 :(得分:1)
如果您使用的是 PostgreSQL ,则可以利用JSONField
在模型中存储 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 中使用这样的自定义过滤器(例如,用于side
属性)。
class SideFilter(JSONFieldFilter):
title = 'Side'
parameter_name = 'side'
json_field_name = 'detail'
json_field_property_name = 'side'
class TrackedEventsAdmin(admin.ModelAdmin):
list_filter = [SideFilter]