gpt4 book ai didi

python - 通常的技巧并不能解决 Django 中的 "expected string or bytes-like object"

转载 作者:太空宇宙 更新时间:2023-11-03 15:05:43 25 4
gpt4 key购买 nike

我正在开发 Django Web 应用程序,并且收到一条讨厌的错误消息。它是“TypeError:预期的字符串或类似字节的对象”。

相关代码如下,分析如下。

完整回溯

Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/core/handlers/exception.py", line 39, in inner
response = get_response(request)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/core/handlers/base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/core/handlers/base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapped_view
return view_func(request, *args, **kwargs)
File "/Users/Philip/Code/GrammieGram/grams/views.py", line 83, in gramsindex
grams_list = grams_list.filter(display_until=[start_time, end_time])
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site- packages/django/db/models/query.py", line 796, in filter
return self._filter_or_exclude(False, *args, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/query.py", line 814, in _filter_or_exclude
clone.query.add_q(Q(*args, **kwargs))
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/sql/query.py", line 1227, in add_q
clause, _ = self._add_q(q_object, self.used_aliases)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/sql/query.py", line 1253, in _add_q
allow_joins=allow_joins, split_subq=split_subq,
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/sql/query.py", line 1187, in build_filter
condition = self.build_lookup(lookups, col, value)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/sql/query.py", line 1083, in build_lookup
return final_lookup(lhs, rhs)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/lookups.py", line 19, in __init__
self.rhs = self.get_prep_lookup()
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/lookups.py", line 59, in get_prep_lookup
return self.lhs.output_field.get_prep_value(self.rhs)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 1417, in get_prep_value
value = super(DateTimeField, self).get_prep_value(value)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 1275, in get_prep_value
return self.to_python(value)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 1378, in to_python
parsed = parse_datetime(value)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/utils/dateparse.py", line 93, in parse_datetime
match = datetime_re.match(value)
TypeError: expected string or bytes-like object
[22/Jun/2017 01:55:31] "GET /robin/grams/ HTTP/1.1" 500 125650

表单.py

from django import forms
import math
import datetime
from django.utils import timezone
from delorean import Delorean
from .models import Gram
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User

class MessageForm(forms.Form):
message = forms.CharField(max_length=141)
delete_delta = forms.DecimalField(min_value = .01)

def save(self, request):
data = self.cleaned_data
def convert_time(num):
minutes = math.ciel(num*60)
return minutes
now = Delorean()
now = st_input.truncate("minute")
now = now.datetime
gram = Gram(message=data['message'], username=request.user.username, sent_time=now, display_until=now+datetime.timedelta(minutes=convert_time(data['delete_delta'])))
gram.save()

模型.py

from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone
import datetime

class Gram(models.Model):
message = models.CharField(max_length=141)
username = models.CharField(max_length=100, default="default")
sent_time = models.DateTimeField(null=True)
display_until = models.DateTimeField(null=True)
def __str__(self):
return self.message

View .py

from django.shortcuts import get_object_or_404, render, redirect
from django.http import HttpResponseRedirect, HttpResponse
from django.urls import reverse
from django.views import generic
from django.utils import timezone
import datetime
from delorean import Delorean
from .models import Gram
from .forms import MessageForm, SignUpForm
from django.contrib.auth import login, authenticate, update_session_auth_hash
from django.contrib.auth.models import User
from django.contrib import messages
from django.contrib.auth.forms import PasswordChangeForm
from django.contrib.auth.decorators import login_required

@login_required
def gramsindex(request, username):
u = request.user.username
new = '/{0}/new/'.format(u)
account = '/{0}/account/'.format(u)
cp = '/{0}/change_password/'.format(u)
grams_list = Gram.objects.order_by('-sent_time')
grams_list = grams_list.filter(username=username)
start_time = Delorean()
start_time = start_time.truncate("minute")
start_time = str(start_time.datetime)
end_time = Delorean()+datetime.timedelta(days=100)
end_time = end_time.truncate("minute")
end_time = str(end_time.datetime)
grams_list = grams_list.filter(display_until=[start_time, end_time])
context = {'grams_list': grams_list}
return render(request, 'grams/index.html', context)

我想做的是根据日期时间之前的显示来过滤消息(称为克)。这是用户输入的数字,我将其作为时间增量的一部分传递到模型保存函数中。我只想显示其显示直到属性现在之后的克。我目前正在使用 Delorean 来使时间对象更易于使用,我不认为这是导致问题的原因。

我查看了以下问题:expected string or buffer ,date_re.match(value) django error , Django DateTimeField TypeError: expected string or bytes-like object , Django datetime migration error

我做了他们建议的一切:进行新的迁移,将默认值更改为 timezone.now,使 DateTimeFields 可以为空。这些都不起作用。根据我通过 Django 源代码跟踪错误的理解,有一个解析函数接受日期时间对象或字符串并将其解析为日期时间对象。这就是导致问题的原因。

我应该去哪里?是否有一些我可以修复的小问题,或者是否有更好的过滤方法,以便它仅显示带有显示直到现在之后的属性的克?

最佳答案

问题很简单,你写的是这样的:

grams_list.filter(display_until=[start_time, end_time])

而不是使用 range查询:

grams_list.filter(display_until__range=[start_time, end_time])

该错误消息是因为默认的 exact 查询需要一个日期时间,而您正在向其传递一个列表。

关于python - 通常的技巧并不能解决 Django 中的 "expected string or bytes-like object",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44689050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com