python - 当标识的值打算为字符串时,如何解决“int() 的无效文字,以 10 为基数”错误
问题描述
从模型创建新对象后,我的站点应该重定向到该对象的详细视图。但是,它不断返回错误消息:“invalid literal for int() with base 10: 'The name grant to my object'”。我在网上查看过,当人们将某些数字解析为字符串而不是 int 或 float 时,通常会收到此错误,但在我的情况下,识别的值显然是一个字符串。
我检查了错误消息,下面详细介绍了我的代码。Python 似乎对 self 变量提出了问题,我用它来过滤来自另一个模型的聚合对象的数量。一些背景:这是我的“加速器”模型中的一种方法,旨在通过汇总对该特定加速器的每次评论的总体评级来确定加速器对象的平均评级。在我的审查模型中,主题字段是加速器模型的外键。
class Accelerator(models.Model):
name = models.CharField(max_length=100)
website = models.CharField(max_length=100)
locations = models.CharField(max_length=100)
bio = models.TextField()
sector_focus = models.CharField(max_length=100)
stage = models.CharField(max_length=100)
deal = models.CharField(max_length=200)
duration = models.CharField(max_length=100)
avg_rating = models.DecimalField(decimal_places=2, max_digits=3)
author = models.ForeignKey(User, on_delete=models.CASCADE, default='admin')
logo = models.ImageField(default='default.jpg', upload_to='logos')
def __str__(self):
return self.name
# Function to configure correct URL once new model instance has been created
def get_absolute_url(self):
return reverse('accelerator_detail', kwargs={'pk': self.pk})
@property
def avg_rating(self):
result = Review.objects.filter(subject=self.name).aggregate(avg_rating=Avg('overall')).avg_rating
return result if result > 0 else 0
class Review(models.Model):
RATINGS = (
('1', '1'),
('2', '2'),
('3', '3'),
('4', '4'),
('5', '5'),
)
subject = models.ForeignKey(Accelerator, on_delete=models.CASCADE, blank=False)
author = models.ForeignKey(User, on_delete=models.CASCADE, blank=False, default='admin')
feedback = models.TextField(blank=False)
date_posted = models.DateTimeField(default=timezone.now)
mentorship = models.CharField(choices=RATINGS, blank=False, max_length=1)
hiring = models.CharField(choices=RATINGS, blank=False, max_length=1)
community = models.CharField(choices=RATINGS, blank=False, max_length=1)
fundraising = models.CharField(choices=RATINGS, blank=False, max_length=1)
corporate_dev = models.CharField(choices=RATINGS, blank=False, max_length=1)
overall = models.DecimalField(decimal_places=2, max_digits=3)
def __str__(self):
return self.subject
def get_absolute_url(self):
return reverse('review_detail', kwargs={'pk': self.pk})
def save(self, *args, **kwargs):
# set the overall field when the model is saved
self.overall = self.mentorship + self.hiring + self.community + \
self.fundraising + self.corporate_dev / 5
super(Review, self).save(*args, **kwargs)
我的回溯:
Traceback (most recent call last):
File "/home/samalty/.local/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/home/samalty/.local/lib/python3.6/site-packages/django/core/handlers/base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/home/samalty/.local/lib/python3.6/site-packages/django/core/handlers/base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/mnt/c/Users/Sam/CSA/csa_project/reviews/views.py", line 36, in accelerator_detail
return render(request, 'reviews/accelerator_detail.html', context)
File "/home/samalty/.local/lib/python3.6/site-packages/django/shortcuts.py", line 36, in render
content = loader.render_to_string(template_name, context, request, using=using)
File "/home/samalty/.local/lib/python3.6/site-packages/django/template/loader.py", line 62, in render_to_string
return template.render(context, request)
File "/home/samalty/.local/lib/python3.6/site-packages/django/template/backends/django.py", line 61, in render
return self.template.render(context)
File "/home/samalty/.local/lib/python3.6/site-packages/django/template/base.py", line 171, in render
return self._render(context)
File "/home/samalty/.local/lib/python3.6/site-packages/django/template/base.py", line 163, in _render
return self.nodelist.render(context)
File "/home/samalty/.local/lib/python3.6/site-packages/django/template/base.py", line 937, in render
bit = node.render_annotated(context)
File "/home/samalty/.local/lib/python3.6/site-packages/django/template/base.py", line 904, in render_annotated
return self.render(context)
File "/home/samalty/.local/lib/python3.6/site-packages/django/template/loader_tags.py", line 150, in render
return compiled_parent._render(context)
File "/home/samalty/.local/lib/python3.6/site-packages/django/template/base.py", line 163, in _render
return self.nodelist.render(context)
File "/home/samalty/.local/lib/python3.6/site-packages/django/template/base.py", line 937, in render
bit = node.render_annotated(context)
File "/home/samalty/.local/lib/python3.6/site-packages/django/template/base.py", line 904, in render_annotated
return self.render(context)
File "/home/samalty/.local/lib/python3.6/site-packages/django/template/loader_tags.py", line 62, in render
result = block.nodelist.render(context)
File "/home/samalty/.local/lib/python3.6/site-packages/django/template/base.py", line 937, in render
bit = node.render_annotated(context)
File "/home/samalty/.local/lib/python3.6/site-packages/django/template/base.py", line 904, in render_annotated
return self.render(context)
File "/home/samalty/.local/lib/python3.6/site-packages/django/template/base.py", line 987, in render
output = self.filter_expression.resolve(context)
File "/home/samalty/.local/lib/python3.6/site-packages/django/template/base.py", line 671, in resolve
obj = self.var.resolve(context)
File "/home/samalty/.local/lib/python3.6/site-packages/django/template/base.py", line 796, in resolve
value = self._resolve_lookup(context)
File "/home/samalty/.local/lib/python3.6/site-packages/django/template/base.py", line 837, in _resolve_lookup
current = getattr(current, bit)
File "/mnt/c/Users/Sam/CSA/csa_project/reviews/models.py", line 29, in avg_rating
result = Review.objects.filter(subject=self.name).aggregate(avg_rating=Avg('overall')).avg_rating
File "/home/samalty/.local/lib/python3.6/site-packages/django/db/models/manager.py", line 82, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/home/samalty/.local/lib/python3.6/site-packages/django/db/models/query.py", line 892, in filter
return self._filter_or_exclude(False, *args, **kwargs)
File "/home/samalty/.local/lib/python3.6/site-packages/django/db/models/query.py", line 910, in _filter_or_exclude
clone.query.add_q(Q(*args, **kwargs))
File "/home/samalty/.local/lib/python3.6/site-packages/django/db/models/sql/query.py", line 1290, in add_q
clause, _ = self._add_q(q_object, self.used_aliases)
File "/home/samalty/.local/lib/python3.6/site-packages/django/db/models/sql/query.py", line 1318, in _add_q
split_subq=split_subq, simple_col=simple_col,
File "/home/samalty/.local/lib/python3.6/site-packages/django/db/models/sql/query.py", line 1251, in build_filter
condition = self.build_lookup(lookups, col, value)
File "/home/samalty/.local/lib/python3.6/site-packages/django/db/models/sql/query.py", line 1116, in build_lookup
lookup = lookup_class(lhs, rhs)
File "/home/samalty/.local/lib/python3.6/site-packages/django/db/models/lookups.py", line 20, in __init__
self.rhs = self.get_prep_lookup()
File "/home/samalty/.local/lib/python3.6/site-packages/django/db/models/fields/related_lookups.py", line 115, in get_prep_lookup
self.rhs = target_field.get_prep_value(self.rhs)
File "/home/samalty/.local/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 966, in get_prep_value
return int(value)
ValueError: invalid literal for int() with base 10: 'Founders Factory'
解决方案
您对查询集的过滤器是错误的。你在说subject=self.name
。因此,基本上,您将 ForeignKey ( subject
) 与字符串 ( self.name
)进行比较
你可以这样做:
@property
def avg_rating(self):
result = Review.objects.filter(subject=self).aggregate(avg_rating=Avg('overall'))
return result
这将返回一个 QuerySet,无论是否为空。然后,在循环遍历它时,您可以访问其中的所有属性,包括avg_rating
.
推荐阅读
- javascript - 将多个 JS 变量传递给 php 以进行 mysql-insertion,尽管没有输入任何条目
- jquery - 修复 Jquery 自动完成搜索框问题
- monitoring - Prometheus:使用 JMX Exporter 进行 Hadoop 监控
- r - 闪亮:通过批处理文件启动应用程序时出现编码/特殊字符问题
- coldfusion - 基于脚本的保留关键字不被接受,但它在标签中被接受
- java - 在 python3 中将 LongBits 转换为浮点数
- javascript - 如何在不使用隐藏输入的情况下使用秒表 javascript 中的 php 在 mysql db 中存储计时器值
- react-native - 通过 Xcode 运行本机项目时,iOS 机器上出现错误。错误代码是-999
- mysql - MYSQL:AND 语句导致预期结果不显示
- python - 如何用 Python 知道进程的生命周期?