Skip to main content
 首页 » 编程设计

python之在模型上运行 objects.all() 时出现 TypeError

2025年05月04日13tuyile006

这是我的模型:

class Workout(models.Model): 
 
    datetime = models.DateTimeField() 
    user = models.ForeignKey(User, on_delete=models.CASCADE) 
    lifts = fields.LiftsField(null=True) 
    cardios = fields.CardiosField(null=True) 
 
    def __str__(self): 
        return str(self.datetime)+" "+self.user.email 
 
    __repr__ = __str__ 

我正在尝试从 django shell 执行此操作:

(workout) Sahands-MBP:workout sahandzarrinkoub$ shell 
Python 3.6.2 (default, Jul 17 2017, 16:44:45)  
[GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
(InteractiveConsole) 
>>> from workoutcal.models import Workout 
>>> Workout.objects.all() 
Traceback (most recent call last): 
  File "<console>", line 1, in <module> 
  File "/Users/sahandzarrinkoub/Documents/Programming/Web/Django/workout/lib/python3.6/site-packages/django/db/models/query.py", line 226, in __repr__ 
    data = list(self[:REPR_OUTPUT_SIZE + 1]) 
  File "/Users/sahandzarrinkoub/Documents/Programming/Web/Django/workout/lib/python3.6/site-packages/django/db/models/query.py", line 250, in __iter__ 
    self._fetch_all() 
  File "/Users/sahandzarrinkoub/Documents/Programming/Web/Django/workout/lib/python3.6/site-packages/django/db/models/query.py", line 1118, in _fetch_all 
    self._result_cache = list(self._iterable_class(self)) 
  File "/Users/sahandzarrinkoub/Documents/Programming/Web/Django/workout/lib/python3.6/site-packages/django/db/models/query.py", line 62, in __iter__ 
    for row in compiler.results_iter(results): 
  File "/Users/sahandzarrinkoub/Documents/Programming/Web/Django/workout/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 842, in results_iter 
    row = self.apply_converters(row, converters) 
  File "/Users/sahandzarrinkoub/Documents/Programming/Web/Django/workout/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 827, in apply_converters 
    value = converter(value, expression, self.connection, self.query.context) 
TypeError: from_db_value() takes 4 positional arguments but 5 were given 

此错误背后的解释是什么?我没有在任何地方发送任何参数,据我所知,错误一定出在我对模型的声明中,但我看不出我犯了什么错误。感谢您的帮助。

编辑:这是包含我的自定义字段的 fields.py:

def parse_lifts(lifts_string): 
    """Takes a string of json and turns it into a Lifts object""" 
    series = json.loads(lifts_string) 
    serie_objects = [models.LiftSerie(serie["liftname"], serie["setlist"]) for serie in series] 
    return models.Lifts(serie_objects) 
 
def parse_cardios(cardios_string): 
    """Takes a string of json and turns it into a Cardios Object""" 
    series = json.loads(cardios_string) 
    serie_objects = [models.CardioSerie(serie["cardioname"], serie["duration"]) for serie in series] 
 
class LiftsField(JSONField): 
    """Field representing a models.Lifts object""" 
 
    def from_db_value(self, value, expression, connection): 
        if value is None: 
            return value 
        return parse_lifts(value) 
 
    def to_python(self, value): 
        if isinstance(value, models.Lifts): 
            return value 
        if value is None: 
            return value 
        return parse_lifts(value) 
 
    def get_prep_value(self, value): 
        if not value: 
            return value 
        lifts_pre_json = [serie_object.pre_json() for serie_object in value.series] 
        return json.dumps(lifts_pre_json) 
 
class CardiosField(JSONField): 
    """Field representing a models.Cardios object""" 
 
    def from_db_value(self, value, expression, connection): 
        if value is None: 
            return value 
        return parse_cardios(value) 
 
    def to_python(self, value): 
        if isinstance(value, models.Cardios): 
            return value 
        if value is None: 
            return value 
        return parse_cardios(value) 
 
    def get_prep_value(self, value): 
        if value == None: 
            return value 
        cardios_pre_json = [serie_object.pre_json() for serie_object in value.series] 
        return json.dumps(cardios_pre_json) 

请您参考如下方法:

您正在使用 Django 2.0 的文档,但似乎运行的是 Django 1.11 或更早版本。在该版本中,from_db_value 需要一个额外的参数,context - 请参阅 the docs .

此参数未使用,已在后续版本中删除。