sakitaliev
@sakitaliev
Мастер костылей

Как правильно взять данные из модели Django?

Здравствуйте, итак проблема:
Делаю календарь, при клике на дату которого выдается объект из модели, но возникла проблема такая, что возвращается не объект из модели, а его def __str__(self)
Итак код:
js:
$('.conf-picker > div').datepicker({  //Делаю из div, jquery ui datepicker
    dateFormat: 'yy-mm-dd',  //Формат даты чтобы совпадал с форматом из модели
    onSelect: function (date) { // Принимает дату на которую я нажал
        $.ajax({
            type: 'POST',
            url: "/conf/", 
            data: {
                date: date  //Отправляю дату на которую нажал
            },
            success: function(response){  // принимаю данные которые отправил
                console.log(response); // вывожу объект в консоли
            },
            error: function (response) {
                console.log(response);
            }
        });
    }
});

views.py:
@csrf_exempt  # Отключаю проверку csrf
def conf_item(request): 
    if request.method == 'POST' and request.is_ajax():
        date = request.POST.get('date') # Беру дату на которую кликнул и которую отправил сюда
        conf = get_object_or_404(Confs, conf_date=date)  # Вытаскиваю объект модели дата из которой равна дате на которую я кликнул
        return HttpResponse(conf) # Возвращаю объект модели

models.py:
class Confs(models.Model):
    name = models.CharField(max_length=100, blank=False, verbose_name='Имя автора конференции')
    image = models.ImageField(upload_to='confs/', default='no_image.png', verbose_name='Фотография автора конференции')
    about = models.TextField(blank=False, default=None, verbose_name='О конференции')
    conf_date = models.DateField(blank=False, default=None, verbose_name='Дата конференции')
    created = models.DateTimeField(auto_now_add=True, auto_now=False, verbose_name='Создано')

    def __str__(self):
        return "Конференция {}".format(self.name)


Возвращает:
def __str__(self):
        return "Конференция {}".format(self.name)

5a06cc2c098a2191066121.png
P.S. Удаление __str__ не решает вопрос
  • Вопрос задан
  • 1155 просмотров
Решения вопроса 1
@deliro
Чтобы эти данные вернуть, нужно их сериализировать. Используй django-rest-framework
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
ramonyaskal
@ramonyaskal
from django.http import HttpResponse, JsonResponse

queryset = JsonResponse(conf, safe=False)
return HttpResponse(queryset)

а в ajax :
response = jQuery.parseJSON(response);
console.log(response);
Ответ написан
Комментировать
@hellpirat
Full stack developer (Python/Django, React.js)
Вы тут с Ajax работаете, https://docs.djangoproject.com/en/1.11/ref/request... так будет думаю правильнее . :) А еще название моделей правильнее делать в единственном числе.
conf = get_object_or_404(Confs, conf_date=date)
return JsonResponse(conf)
Ответ написан
sim3x
@sim3x
В модели три поля, которые требуется руками преобразовать в текст
Самое простое использовать класс ObjectEncoder и превратить екземпляр модели в дикт с помощью model_to_dict
С одной оговоркой - поле created после установки auto_add_now=True становится editable=False и model_to_dict его игнорирует

Второй вариант создать руками дикт из екземпляра модели - тут можно делать, как угодно
Но руками
Также будут проблемы с преобразованием DecimalField, FileField

from django.shortcuts import render
from e.models import Conf
from django.http.response import JsonResponse, HttpResponse
import json
import datetime
from django.db.models.fields.files import ImageFieldFile
from django.forms.models import model_to_dict

class ObjectEncoder(json.JSONEncoder):

    def default(self, obj):
        if hasattr(obj, "to_json"):
            return self.default(obj.to_json())

        if isinstance(obj, datetime.date):
            return obj.strftime('%Y-%m-%d')

        if isinstance(obj, datetime.datetime):
            # return obj.isoformat()
            return obj.strftime('%Y-%m-%d; %H-%M-%s')

        if isinstance(obj, ImageFieldFile):
            return obj.url

        return repr(obj)



def r(request):
    c = Conf.objects.get(id=1)
    # second option - manual
    d = {
        'name': c.name,
        'image': c.image.url,
        'about': c.about,
        'conf_date': c.conf_date.isoformat(),
        'created': c.created1.isoformat()
    }
    # first option automatic
    d = model_to_dict(c)
    
    return JsonResponse(d, encoder=ObjectEncoder)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
28 апр. 2024, в 19:54
2000 руб./за проект
28 апр. 2024, в 19:54
5000 руб./за проект
28 апр. 2024, в 19:44
10000 руб./за проект