0

我有这个简单的函数来从数据库中检索数据:

function find_object() {
    $.ajax({type: 'POST',
        url: '/find-object/',
        data: {
            position: position,
        },
        success: function (result_list) {
            if (result_list.result === 'OK') {
                console.log(result_list.data.myobject)
            } else {
                console.log('not found')
            };

        }
    });
};

这里是view

def find_object(request):
    if request.is_ajax():
        position = request.POST.get('position', None);
        try:
            my_object=My_Class.objects.get(coordinate=position)
        except:
            return JsonResponse({'result': 'None'})
        my_other_object=My_Other_Class.objects.filter(my_ForeignKey_field=my_object)
        if my_related_object:
            my_field=my_other_object.my_field
            #do things
        return JsonResponse({'result': 'OK', 'data': { 'myobject': my_object }})

它给出了错误my_object is not JSON serializable,因为它不是一个查询集,因为它来自.get()所以我不能像这样序列化:

my_object_json=serializers.serialize('json', my_object)

在我使用的第一个请求中,.get()因为它比.filter()(当异常罕见时)更快。对于每个position只有一个my_object或(很少)没有。在我使用的第二个请求中,.filter()因为异常并不罕见。

所以问题:

.filter()1)使用它是否更快.get(),然后my_object像上面那样序列化还是有其他方法?也许没有 JsonResponse?我需要包含所有字段的对象

2)是 ForeignKeymy_other_object类的一个实例。my_object我想要的是?如果my_object存在,我想看看是否存在通讯员my_other_object并找到他的一个字段的值。对于每个my_object只有一个my_other_object或没有。我的解决方案有效,但也许有更快的方法。

另外:我应该使用 else 条件if request.is_ajax()吗?为什么不应该是ajax?

谢谢你

4

1 回答 1

1

0) Django 模型实例不可序列化。你也不能序列化一个查询集,但这并不意味着你可以序列化一个实例。使其可序列化的一种简单方法是像这样获取它的值

my_object_serialized = list(my_object.values('the', 'fields', 'that', 'you', 'need'))  

1)这需要更长的答案。get()just和filter()since之间存在性能差异,get()可以返回它在数据库中看到的第一个实例,但filter()必须遍历整个表。但是你改变它的第二个filter()应该filter()[0]等于get()性能方面的。这几乎无关紧要。为什么?

filter()并且get()分开存在,因为它们的使用方式彼此不同。如果您知道数据库中只有一个这样的对象,或者您想验证您只有一个对象,那么您可以使用get(),因为当查询的事物有 0 个或多个实例时,它会引发异常。MyModel.objects.filter(myfield=myvalue).get()出于同样的原因, 您甚至可以这样做-get()验证只有一个对象。
如果您只想获得第一个并且不在乎有多少,那么首选的方法是使用filter().first()返回第一个对象或None万一没有对象的模式。就像用[0]符号获取第一个项目一样,调用first()afilter()与调用的性能完全相同get(),不同之处在于 Python 端发生了什么。

2)您的解决方案非常好。对于这个用例,没关系。

额外问题:如果视图仅用于通过 ajax 使用,我将return HttpResponseBadRequest()在最后添加else或仅在基本功能级别添加。

于 2017-09-14T06:29:24.003 回答