Django ORM problems with AJAX

I have an aobut Django ORM question with ajax function request:


I have a request:

prod_serv = Product_service.objects.select_related()


Where I join 3 models

to foreign key c related_name

. In a simple Django loop, I can extract values ​​like this:

{% 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">{{ }}</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 %}


The most important part:

  • x.category_id.type_id
  • x.unit_id

Where can I access the values ​​associated with the name. Example:


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):

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(


The for-loop does everything right, but I want to do it with ajax. So when I post this request in ajax, I cannot retrieve values ​​like in for loop.

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')


I dont know what I am doing wrong in this request by sending it in ajax. Is there any other way to send values ​​to ajax with extracted fields from models?


source to share

2 answers

Whenever you use Django and Ajax, you should think about a rest framework (like Django Rest Framework ). Hand rewinding your own ajax and endpoints is like reinventing the wheel while other very smart people open up their code for you. Using a framework with Ajax allows you to break your model manipulation out of the Django request-response loop and handle things easily in the browser.

There are three steps:

  • Install DRF and adjust model endpoints
  • Write ajax request to reach the endpoint.
  • Manipulate the DOM based on the response.

Example template:


{% 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){

    // Hit the rest endpoint to get data from the browser
            'name': 'foo'
    ).done(function(data) {
        alert( "success" );
    .fail(function() {
        alert( "error" );
    .always(function() {
        alert( "complete" );

{% endblock extra_js %}




Try to use

import django.utils.simplejson as json



OR you can use serializer

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




All Articles