【问题标题】:I've got error message : TypeError: unsupported operand type(s) for %: 'DeferredAttribute' and 'dict' in django我收到错误消息:TypeError: unsupported operand type(s) for %: 'DeferredAttribute' and 'dict' in django
【发布时间】:2020-03-11 22:32:49
【问题描述】:

我在我的 django rest framework 应用程序中创建了新模型,我收到了以下错误消息:

TypeError: unsupported operand type(s) for %: 'DeferredAttribute' and 'dict'

这是错误截图:

我不明白有什么问题?

这是我的models.py

from django.db import models

class TblUserAccounts(models.Model):
    uid = models.AutoField(primary_key=True)
    username = models.CharField(unique=True, max_length=20)
    alias_username = models.CharField(unique=True, max_length=20, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'tbl_user_accounts'
        ordering = ['uid']


class TblUserDetails(models.Model):
    detail_id = models.IntegerField(primary_key=True)
    useraccount = models.ForeignKey(TblUserAccounts, models.DO_NOTHING, related_name=TblUserAccounts.uid)
    first_name = models.CharField(max_length=25, blank=True, null=True)
    last_name = models.CharField(max_length=45, blank=True, null=True)
    birthdate = models.DateTimeField(blank=True, null=True)
    record_time = models.DateTimeField()
    creator = models.ForeignKey(TblUserAccounts, models.DO_NOTHING, related_name=TblUserAccounts.uid, db_column='creator')

    class Meta:
        managed = False
        db_table = 'tbl_user_details'
        ordering = ['record_time']


class TblUserPassword(models.Model):
    id_password = models.AutoField(primary_key=True)
    useraccount_id_pwd = models.ForeignKey(TblUserAccounts, models.DO_NOTHING, related_name=TblUserAccounts.uid, db_column='useraccount_id_pwd')
    salt = models.CharField(max_length=200, blank=True, null=True)
    hash = models.CharField(max_length=200, blank=True, null=True)
    record_time = models.DateTimeField()
    creator = models.ForeignKey(TblUserAccounts, models.DO_NOTHING, related_name=TblUserAccounts.uid, db_column='creator')

    class Meta:
        managed = False
        db_table = 'tbl_user_password'
        ordering = ['record_time']

当然你应该知道我是 Python 编程新手。

我猜是TblUserDetails 模型的问题,但我不知道是什么问题?

非常感谢您的关注。

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    由于无法对其进行测试,我真的只能在黑暗中开枪。虽然做了一些阅读,但我认为问题在于您用于 related_name 的内容。请尝试以下操作:

    class TblUserDetails(models.Model):
        detail_id = models.IntegerField(primary_key=True)
        useraccount = models.ForeignKey(TblUserAccounts, models.DO_NOTHING, related_name='TblUserAccounts.uid')
        first_name = models.CharField(max_length=25, blank=True, null=True)
        last_name = models.CharField(max_length=45, blank=True, null=True)
        birthdate = models.DateTimeField(blank=True, null=True)
        record_time = models.DateTimeField()
        creator = models.ForeignKey(TblUserAccounts, models.DO_NOTHING, related_name='TblUserAccounts.uid', db_column='creator')
    
        class Meta:
            managed = False
            db_table = 'tbl_user_details'
            ordering = ['record_time']
    

    请注意,如果这是问题所在,您也需要对 TblUserPassword 进行此修复。

    我认为related_name不应该指向另一个类的属性,它只是一个名称字段:

    ForeignKey.related_name

    用于关系的名称 相关对象回到这个。这也是默认值 related_query_name(用于反向过滤器名称的名称 目标模型)。有关完整的信息,请参阅相关对象文档 解释和例子。请注意,您必须在以下情况下设置此值 定义抽象模型的关系;当你这样做时,一些特别的 语法可用。

    如果您不希望 Django 创建反向关系,请设置 related_name 到 '+' 或以 '+' 结尾。例如,这将确保 User 模型与该模型没有反向关系。

    user = models.ForeignKey(
        User,
        on_delete=models.CASCADE,
        related_name='+', )
    

    如果这不是问题,请告诉我,我会看看能否找到其他问题。

    【讨论】:

      猜你喜欢
      • 2020-04-04
      • 1970-01-01
      • 2021-12-25
      • 2021-03-27
      • 2020-04-14
      • 2016-08-30
      • 1970-01-01
      • 2021-09-12
      • 1970-01-01
      相关资源
      最近更新 更多