2015-05-04 71 views
3

我有问题aobut Django的ORM与功能Ajax请求:Django的ORM问题与AJAX

select_related

我有这样的查询:

prod_serv = Product_service.objects.select_related() 

当我加入3 models与外键related_name。 简单的Django的for循环,我可以提取值如下:

{% for x in a %} 
         <td><label class="form-checkbox form-normal form-primary "><input type="checkbox" checked=""></label></td> 
         <td class="hidden-xs">{{ x.product_code }}</td> 
         <td class="hidden-xs">{{ x.name }}</td> 
         <td class="hidden-xs">{{ x.description }}</td> 
         <td class="hidden-xs">{{ x.selling_price }}</td> 
         <td class="hidden-xs">{{ x.unit_id }}</td> 
         <td class="hidden-xs">{{ x.category_id.type_id }}</td> 

        {% endfor %} 

最importan部分是:

  1. x.category_id.type_id
  2. x.unit_id

在哪里我可以访问值相关的名称。 例子:

车型

class Product_service(models.Model): 
    id = models.AutoField(primary_key=True) 
    name = models.CharField(max_length=255, blank=True, null=True) 
    selling_price = models.DecimalField(decimal_places=5, max_digits=255, blank=True, null=True) 
    purchase_price = models.DecimalField(decimal_places=5, max_digits=255, blank=True, null=True) 
    description = models.CharField(max_length=255, blank=True, null=True) 
    image = models.FileField(upload_to="/", blank=True, null=True) 
    product_code = models.CharField(max_length=255, blank=True, null=True) 
    product_code_supplier = models.CharField(max_length=255, blank=True, null=True) 
    product_code_buyer = models.CharField(max_length=255, blank=True, null=True) 
    min_unit_state = models.CharField(max_length=255, blank=True, null=True) 
    state = models.CharField(max_length=255, blank=True, null=True) 
    vat_id = models.ForeignKey('VatRate', related_name='vat_rate') 
    unit_id = models.ForeignKey('Units', related_name='unit_value') 
    category_id = models.ForeignKey('Category', related_name='product_services') 


    def __str__(self): 
     return self.name 

class Units(models.Model): 
    id = models.AutoField(primary_key=True) 
    unit_name = models.CharField(max_length=255) 

    def __str__(self): 
     return self.unit_name 

class VatRate(models.Model): 
    id = models.AutoField(primary_key=True) 
    rate = models.CharField(max_length=255) 
    description = models.CharField(max_length=255) 

    def __str__(self): 
     return self.rate 


class CategoryType(models.Model): 
    id = models.AutoField(primary_key=True) 
    type = models.CharField(max_length=255) 

    def __str__(self): 
     return self.type 

class Category(models.Model): 
    id = models.AutoField(primary_key=True) 
    type_id = models.ForeignKey('CategoryType') 
    name = models.CharField(max_length=255) 


    def __str__(self): 
     return str(self.name) 

for循环赛普尔做everthin正确的,但我想用Ajax做到这一点。所以当我发送这个查询到ajax我不能提取像循环中的值。

views.py

@login_required 
@csrf_protect 
def ajax_request(request): 


    prod_serv = Product_service.objects.select_related() 

    if request.is_ajax(): 
     mega = serializers.serialize('json', prod_serv) 
     return HttpResponse(mega, 'json') 

我不知道我在我在此查询其发送给阿贾克斯做错了。有没有其他的方式来从模型中提取字段值给ajax?

+1

也许这对您来说更加方便JSON-ify prod_serv Queryset作为列表列表,并只将您需要的值转换为JSON?类似于'prod_serv = Product_service.objects.values_list('category_id__type_id','unit_id')',然后'mega = serializers.serialize('json',list(prod_serv))' –

回答

2

每当你使用Django和Ajax,你应该考虑休息框架(如Django Rest Framework)的尝试。手动滚动你自己的ajax端点正在重新发明轮子,而其他非常聪明的人已经为你开源。通过使用带有Ajax的框架,您可以将模型操作从Django请求 - 响应循环中分离出来,并在浏览器中轻松处理。

有3个步骤:

  1. 安装DRF并设置一些模型端点
  2. 编写Ajax请求打到您的端点
  3. 操纵根据响应的DOM。

实施例的模板:

模板。html

{% block extra_js %} 

<script type="text/javascript"> 
    // Forgive the pseudocode, I have not run this. 
    // Uses jquery because everything does. 

    // For each item in an array, add it to a selected table in a new row 
    var do_dom_manipulation = function(data){ 
     $.each(data, function(d){ 
      $('table.mytable').append('<tr>'+d+'<tr>') 
     }) 
    } 

    // Hit the rest endpoint to get data from the browser 
    $.ajax('api/models', 
     { 
      'name': 'foo' 
     } 
    ).done(function(data) { 
     alert("success"); 
     do_dom_manipulation(data) 
    }) 
    .fail(function() { 
     alert("error"); 
    }) 
    .always(function() { 
     alert("complete"); 
    }); 
</script> 

{% endblock extra_js %} 
+0

是的,当我用Rest Framework查询工作正常。 Thx解决方案。 @ bwarren2 – marin

1

使用

import django.utils.simplejson as json 

json.dumps(prod_serv) 

或者您可以使用串行

from django.core import serializers 
# serialize queryset 
serialized_queryset = serializers.serialize('json', prod_serv)