/writeReview/1__str__处的Django模型TypeError返回非字符串(类型为int)



我面临与上述错误有关的问题(也如图4所示(。有人能帮我吗?我在尝试提交将数据保存到ReviewTable的表单时看到了这个错误,如图2所示。我还添加了以下代码:


TypeError at /writeReview/1
__str__ returned non-string (type int)
Request Method:     GET
Request URL:    http://55fde5117b01476bb57eb987ae0e9a37.vfs.cloud9.us-east-2.amazonaws.com/writeReview/1?csrfmiddlewaretoken=yJ0M6sDxPjEZJmJxrR0JMLFYJzboppJ6NGfa5H25D7ieDNTVQKIy9pFhu9WKYsDA&reviewText=This+is+a+test+&rating=2
Django Version:     3.0.2
Exception Type:     TypeError
Exception Value:    
__str__ returned non-string (type int)
Exception Location:     /home/ec2-user/.local/lib/python3.6/site-packages/django/db/models/base.py in __repr__, line 518
Python Executable:  /usr/bin/python36
Python Version:     3.6.10
Python Path:    
['/home/ec2-user/environment/HangryBirds',
'/usr/lib64/python3.6',
'/usr/lib64/python3.6/lib-dynload',
'/home/ec2-user/.local/lib/python3.6/site-packages',
'/usr/local/lib64/python3.6/site-packages',
'/usr/local/lib/python3.6/site-packages',
'/usr/lib64/python3.6/dist-packages',
'/usr/lib/python3.6/dist-packages']
Server time:    Thu, 2 Apr 2020 16:44:16 +0000
Traceback Switch to copy-and-paste view
/home/ec2-user/.local/lib/python3.6/site-packages/django/db/models/fields/__init__.py in get_prep_value
return int(value)
…
▶ Local vars
During handling of the above exception (int() argument must be a string, a bytes-like object or a number, not 'RestaurantTable'), another exception occurred:
/home/ec2-user/.local/lib/python3.6/site-packages/django/core/handlers/exception.py in inner
response = get_response(request)
…
▶ Local vars
/home/ec2-user/.local/lib/python3.6/site-packages/django/core/handlers/base.py in _get_response
response = self.process_exception_by_middleware(e, request)
…
▶ Local vars
/home/ec2-user/.local/lib/python3.6/site-packages/django/core/handlers/base.py in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
…
▶ Local vars
/home/ec2-user/environment/HangryBirds/home/views.py in writeReview
newReview.save()
```

Views.py[1]
Here's the views.py file where the form data is saved to the ReviewTable in models.py
def writeReview(request, parameter):
if request.method == 'GET':
newReview = ReviewTable()
username = request.session['username']
newReview.review = request.GET['reviewText']
newReview.rating = request.GET['rating']
newReview.timestamp = datetime.datetime.now()
newReview.userObj_id = UserTable.objects.filter(username=username)
newReview.menuObj_id = parameter
newReview.restObj_id = MenuTable.objects.filter(item_ID=parameter).first().restObj
newReview.save()
template = loader.get_template("showReview.html")
return HttpResponse(template.render())
else:
template = loader.get_template("home.html")
return HttpResponse(template.render())```

型号.py2这是ReviewTable的模式:-


class ReviewTable(models.Model):
userObj = models.ForeignKey(UserTable, on_delete=models.CASCADE)
menuObj = models.ForeignKey(MenuTable, on_delete=models.CASCADE)
restObj = models.ForeignKey(RestaurantTable, on_delete=models.CASCADE)
review = models.CharField(max_length=1000)
timestamp = models.DateTimeField(auto_now=True, editable=True)
rating = models.IntegerField()
def __str__(self):
return self.id```
ShowReview.html[3]
Here's the html form section where the data is transfered to views.py for saving to the table.
```<div class="right-template">
{% for m in menu_ID %}
<h2>{{ m.item_name }}</h2>
<h2>Reviews</h2>
{% for r in review_ID %}
{% if r.menuObj_id == m.item_ID %}
<h4>{{ r.userObj.username }}</h4>
<p>{{ r.review }}</p>
<p>{{ r.timestamp }}</p>
<p>{{ r.rating }}</p>
{% endif %}
{% endfor %}
<h2>Write a Review</h2>
{% block content %}
<form method="GET" action="{% url 'writeReview' parameter=m.item_ID %}" >
{% csrf_token %}
<div>
<textarea id="reviewText" name="reviewText" rows="5" cols="50" max_length="900"></textarea>
<label for="rating">Rating</label>
<input type="number" name="rating" max_length="5" id=rating>
<button type="submit" class="btnRest">Submit</a>
</div>    
</form>
{% endblock %}
{% endfor %}

错误pic4

正如异常所说,__str__应该返回字符串self.id是一个int,而不是一个字符串。您可以使用str(..)将int转换为字符串:

class ReviewTable(models.Model):
# …
def __str__(self):
returnstr(self.id)

请注意,在您看来,您应该使用.newReview.restObj = restaurant_object.newReview.restObj_id = id_of_restaurant_object:

def writeReview(request, parameter):
if request.method == 'GET':
newReview = ReviewTable()
username = request.session['username']
newReview.review = request.GET['reviewText']
newReview.rating = request.GET['rating']
newReview.timestamp = datetime.datetime.now()
newReview.userObj= UserTable.objects.get(username=username)
newReview.menuObj_id = parameter
newReview.restObj= MenuTable.objects.first(item_ID=parameter).restObj
newReview.save()
template = loader.get_template("showReview.html")
return HttpResponse(template.render())
else:
template = loader.get_template("home.html")
return HttpResponse(template.render())

注意:GET请求是而不是应该具有副作用,因此构造当用户发出GET请求时,对象不符合HTTP标准因此,最好将其转换为POST请求。

最新更新