1

我在我的 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模型上,但我不知道是什么?

非常感谢您的关注。

4

1 回答 1

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='+', )

让我知道这是否不是问题,我会看看是否能找到其他东西。

于 2019-11-15T18:44:08.943 回答