我的观点有问题

时间:2019-05-10 16:17:03

标签: django django-models django-views

我有这个模型:

Class Category(models.Model):
    name = models.CharField(max_length=150, unique=True)
    description = models.CharField(max_length=250)

    def get_absolute_url(self):
        return reverse('categories_url', args=[str(self.id)])

class Company(models.Model):
    name = models.CharField(max_length=150, unique=True)
    country = models.CharField(max_length=50)

class Motobike(models.Model):
    name = models.CharField(max_length=150)
    company = models.ForeignKey('Company', on_delete=models.CASCADE)
    category = models.ForeignKey('Category', on_delete=models.CASCADE)

    def get_absolute_url(self):
        return reverse('details_url', args=[str(self.id)])

视图:

class CategoryView(DetailView):
    model = Motobike
    template_name = 'bikes_site/categories_detail.html'
    pk_url_kwarg = 'pk'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        category = self.get_object()
        context['motobikes'] = Motobike.objects.filter(category_id=category.pk)
        return context

并测试:

def test_category(setup):
    client = Client()
    category_id = Category.objects.get(name='Мотоциклы').id
    response = client.get(f'/categories/{category_id}/')
    assert response.status_code == 200

    response_data = json.loads(response.content.decode('utf-8'))
    assert len(response_data) == 2
    assert response_data[1]['name'] == 'Ninja Turbo'
    assert response_data[1]['vendor'] == 'Kawasaki'
    assert response_data[1]['category'] == 'Мотоциклы'
    assert response_data[1]['description'] == ''

    response = client.get(f'/categories/25/')
    assert response.status_code == 404

我需要通过JsonResponce用JSON呈现所有瘦对象,并且字典的含义几乎是什么,我是否正确创建了它们?

1 个答案:

答案 0 :(得分:0)

您应该执行类似的操作:

from django.http import JsonResponse

class CategoryView(DetailView):
    model = Motobike
    template_name = 'bikes_site/categories_detail.html'
    pk_url_kwarg = 'pk'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        category = self.get_object()
        context['motobikes'] = Motobike.objects.filter(category_id=category.pk)
        return JsonResponse(context, status=200) # or wahtever status is appropriate

注意:尚未测试,但这就是我在GenericAPIView

中使用的方法