【问题标题】:Django 'ModelBase' object is not iterable TypeErrorDjango 'ModelBase' 对象不可迭代 TypeError
【发布时间】:2020-12-18 03:09:02
【问题描述】:

从 Django 的单元测试中获取以下内容。似乎无法弄清楚发生这种情况的原因。

我的迁移看起来与我所做的其他迁移相同。

另外,我可以在本地机器的管理部分运行它,所以我的另一个问题是,如果它在测试期间发生,是否可以实时推送,这很重要。尝试在此处遵循最佳实践,因此感谢其他人对此的意见。

models.py

class LeadComplete(models.Model):
    """Complete lead info"""
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.DO_NOTHING,
    )
    title=models.CharField(max_length=255)
    time_minutes = models.IntegerField()
    score = models.DecimalField(max_digits=5, decimal_places=2)
    link = models.CharField(max_length=255, blank=True)
    client = models.ManyToManyField('Client')
    
    def __str__(self):
        return self.title

序列化器.py

class LeadCompleteSerializer(serializers.ModelSerializer):
    """Serialize a leadComplete"""
    client = serializers.PrimaryKeyRelatedField(
        many=True,
        queryset=Client.objects.all()
    )
    
    class Meta:
        model = LeadComplete
        fields = [
            'id', 'title', 'time_minutes', 'score', 'link', 'client',
        ]
        read_only_fields = ('id',)

views.py

class LeadCompleteViewSet(viewsets.ModelViewSet):
    """Manage LeadComplete in the database"""
    serializer_class = serializers.LeadCompleteSerializer
    queryset = LeadComplete.objects.all()
    authentication_classes = (TokenAuthentication,)
    permission_classes = (IsAuthenticated,)

    def get_queryset(self):
        """Retrieve the leadcomplete for the authed user"""
        return self.queryset.filter(user=self.request.user)

test_lead_complete_api.py

from django.contrib.auth import get_user_model
from django.test import TestCase
from django.urls import reverse

from rest_framework import status 
from rest_framework.test import APIClient

from core. models import LeadComplete

from leads.serializers import LeadCompleteSerializer

LEADCOMPLETE_URL = reverse('leads:leadcomplete-list')

def sample_leadComplete(user, **params):
    """Create and return a sample leadComplete"""
    defaults = {
        'title': 'Samle Company',
        'time_minutes': 10,
        'score': 5.00,
    }
    defaults.update(params)

    return LeadComplete.objects.create(user=user, **defaults)

def PublicLeadCompleteApiTests(TestCase):
    """Test unauthenticated LeacComplete access"""

    def setUp(self):
        self.client = APIClient()

    def test_auth_required(self):
        """"Test that authentication is required"""
        res = selft.client.get(LEADCOMPLETE_URL)

        self.assertEqual(res.status_code, status.HTTP_401_UNAUTHORIZED)
    
class PrivateLeadCompleteApiTests(TestCase):
    """"Test authenticated recipe API access"""

    def setUp(self):
        self.client = APIClient()
        self.user = get_user_model().objects.create_user(
            'test@unionresolute.com',
            'testpass'
        )
        self.client.force_authenticate(self.user)

    def test_retrieve_leadComplete(self):
        """Test retrieving LeadComplete list"""
        sample_leadComplete(user=self.user)
        sample_leadComplete(user=self.user)

        res = self.client.get(LEADCOMPLETE_URL)

        leadComplete = LeadComplete.objects.all().order_by('-id')
        serializer = LeadCompleteSerializer(LeadComplete, many=True)
        self.assertEqual(res.status_code, status.HTTP_200_OK)
        self.assertEqual(res.data, serializer.data)

    def test_leadComplete_limited_to_user(self):
        """Test retrieving leadComplete for user"""
        user2 = get_user_model().objects.create_user(
            'other@unionresolute.com',
            'password123'
        )
        sample_leadComplete(user=user2)
        sample_leadComplete(user=self.user)

        res = self.client.get(LEADCOMPLETE_URL)

        leadComplete = LeadComplete.objects.filter(user=self.user)
        serializer = LeadCompleteSerializer(leadComplete, many=True)
        self.assertEqual(res.status_code, status.HTTP_200_OK)
        self.assertEqual(res.data, serializer.data)

错误:

ERROR: test_retrieve_leadComplete (leads.tests.test_leadcomplete_api.PrivateLeadCompleteApiTests)
Test retrieving LeadComplete list
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/app/leads/tests/test_leadcomplete_api.py", line 58, in test_retrieve_leadComplete
    self.assertEqual(res.data, serializer.data)
  File "/usr/local/lib/python3.7/site-packages/rest_framework/serializers.py", line 768, in data
    ret = super(ListSerializer, self).data
  File "/usr/local/lib/python3.7/site-packages/rest_framework/serializers.py", line 262, in data
    self._data = self.to_representation(self.instance)
  File "/usr/local/lib/python3.7/site-packages/rest_framework/serializers.py", line 686, in to_representation
    self.child.to_representation(item) for item in iterable
TypeError: 'ModelBase' object is not iterable

【问题讨论】:

    标签: django django-models django-rest-framework django-views django-serializer


    【解决方案1】:

    测试客户端在 content 属性中返回数据。

    尝试res.content 而不是res.data

    def test_retrieve_leadComplete(self):
        """Test retrieving LeadComplete list"""
        sample_leadComplete(user=self.user)
        sample_leadComplete(user=self.user)
    
        res = self.client.get(LEADCOMPLETE_URL)
    
        leadComplete = LeadComplete.objects.all().order_by('-id')
        serializer = LeadCompleteSerializer(LeadComplete, many=True)
        self.assertEqual(res.status_code, status.HTTP_200_OK)
        self.assertEqual(res.content, serializer.data)
    

    【讨论】:

      猜你喜欢
      • 2022-10-13
      • 2020-02-28
      • 2019-07-25
      • 2021-10-03
      • 2021-06-09
      • 2021-08-02
      • 1970-01-01
      • 2013-09-01
      • 2019-04-18
      相关资源
      最近更新 更多