Django:分配外键 - 无法获取类的代表

2024-02-14

我在这里问这个问题是因为,在我的搜索中,这个错误通常与查询有关,而不是与外键分配有关。

我收到的错误发生在模型的方法中。这是代码:

class Deal(models.Model):

    ...model_fields...

    def _update_existing_deal(self, deal_dict):
        #deal made from deal_dict here, psuedo code below
        deal = Deal(deal_dict)
        HistoricalDeal().create_historical_deal(deal)


        self.price = deal_dict.get('price', self.price)
        if self.comment != deal_dict.get['comment']:
            self.comment = deal_dict.get('comment', '')
        self.set_unit_price()
        logger.debug(
            'Existing deal, (pk: %d), updated.',
            self.pk
        )

class HistoricalDeal(models.Model):
    deal = models.ForeignKey(Deal)
    created_at = models.DateTimeField(auto_now_add=True)
    price = models.DecimalField(max_digits=8, decimal_places=2, blank=True,
                                default=0)
    unit_price = models.DecimalField(decimal_places=2, max_digits=6,
                                     null=True, blank=True)

    def create_historical_deal(self, deal):
        self.deal = deal
        self.price = deal.price
        self.unit_price = deal.unit_price
        self.save()
        logger.debug(
            'HistoricalDeal created for Deal with pk: %d.',
            deal.pk
        )

    def __str__(self):
        return ', '.join([self.deal.name, self.created_at.date()])

The thing is, the Deal I am passing to HistoricalDeal.create_historical_deal is legit. Here's a picture of the debugger in PyCharm. Debugger Message

对于搜索引擎来说,消息是:

Unable to get repr for <class 'deals.models.HistoricalDeal'>

有任何想法吗?

编辑:交易的完整代码如下:

class Deal(models.Model):
    LUMBER = 'lumber'
    WOODBLANK = 'woodblank'
    DOWEL = 'dowel'
    VENEER = 'veneer'
    PLYWOOD = 'plywood'

    TYPE_CHOICES = (
        (LUMBER, 'Lumber'),
        (WOODBLANK, 'Wood Blank'),
        (DOWEL, 'Dowel'),
        (VENEER, 'Veneer'),
        (PLYWOOD, 'Plywood'),
    )

    # define the correct method and unit for each material type
    # mainly used in `get_unit_price`
    MATERIAL_MAPPING = {
        LUMBER: {
            'method': lambda self: float(self.price) / (float(self.board_feet) or 1),
            'unit': 'BF',
        },
        WOODBLANK: {
            'method': lambda self: self.price,
            'unit': 'Purchase',
        },
        DOWEL: {
            'method': lambda self: float(self.price) / (float(self.linear_feet) or 1),
            'unit': 'LF',
        },
        VENEER: {
            'method': lambda self: float(self.price) / (float(self.square_feet) or 1),
            'unit': 'SF',
        },
        PLYWOOD: {
            'method': lambda self: float(self.price) / (float(self.square_feet) or 1),
            'unit': 'SF',
        }
    }

    name = models.CharField(max_length=200)
    slug = models.SlugField(max_length=100)
    url = models.CharField(max_length=200, blank=True)
    vendor = models.ForeignKey('Vendor')
    category = models.ForeignKey('Category')
    active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    price = models.DecimalField(max_digits=8, decimal_places=2, blank=True,
                                default=0)
    comment = models.TextField(blank=True)
    img = models.ImageField(blank=True)
    unique_lot = models.IntegerField(default=None, blank=True, null=True)

    material_type = models.CharField(max_length=9, choices=TYPE_CHOICES)

    # attributes specific to material types
    board_feet = models.DecimalField(decimal_places=2, max_digits=6,
                                     null=True, blank=True)
    thickness = models.CharField(max_length=15,
                                 null=True, blank=True)
    length = models.CharField(max_length=15,
                              null=True, blank=True)
    width = models.CharField(max_length=15,
                             null=True, blank=True)
    diameter = models.CharField(max_length=15,
                                null=True, blank=True)
    linear_feet = models.DecimalField(decimal_places=2, max_digits=6,
                                      null=True, blank=True)
    square_feet = models.DecimalField(decimal_places=2, max_digits=6,
                                      null=True, blank=True)
    adhesive_backing = models.NullBooleanField(default=False,
                                               null=True, blank=True)

    image = models.ForeignKey('Image', null=True, blank=True)

    unit_price = models.DecimalField(decimal_places=2, max_digits=6,
                                     null=True, blank=True)

    def set_unit_price(self):
        method = self.MATERIAL_MAPPING[self.material_type]['method']
        self.unit_price = method(self)
        self.save()

    @property
    def get_unit_price(self):
        method = self.MATERIAL_MAPPING[self.material_type]['method']
        unit = self.MATERIAL_MAPPING[self.material_type]['unit']
        return {
            'value': method(self),
            'units': unit
        }

    @classmethod
    def _find_matching_deal(cls, deal_dict):
        """ Check for an existing deal that matches `deal_dict` """
        # TODO: use get_or_create?
        match = cls.objects.filter(
            material_type=deal_dict.get('deal_type', None),
            board_feet=deal_dict.get('boardfeet', None),
            thickness=deal_dict.get('thickness', None),
            length=deal_dict.get('length', None),
            width=deal_dict.get('width', None),
            diameter=deal_dict.get('diameter', None),
            linear_feet=deal_dict.get('linear_feet', None),
            square_feet=deal_dict.get('square_feet', None),
            adhesive_backing=deal_dict.get('adhesive_backing', None),
            unique_lot=deal_dict.get('unique_lot', None),
            category=deal_dict['category'],
            url=deal_dict['url']
        )
        if not match:
            return None
        # Because of the unique constraint, there should only be one match
        assert len(match) == 1
        return match[0]

    @staticmethod
    def _guess_category(name, url):
        """ Find the category that best matches the deal name/url """
        name = name.lower()
        url = url.lower()
        # create a string of unique possible name variants
        search_string = '|'.join({
            name,
            name.replace(' ', ''),
            name.replace('_', ' '),
            name.replace('-', ' '),
            name.replace('_', ''),
            name.replace('-', ''),
            url.replace(' ', ''),
            url.replace('-', ' '),
            url.replace('_', ' '),
            url.replace('-', ''),
            url.replace('_', ''),
        })
        # TODO: cache categories, don't query each time
        all_categories = Category.objects.all()

        # get a list of categories that might match
        matching_categories = [
            category for category in all_categories
            if category.name.lower() in search_string
            ]
        logger.debug('Found these category matches for %s: %s', name,
                     matching_categories)
        if len(matching_categories) == 0:
            matching_categories = [
                category for category in all_categories
                if category.name.replace(' ', '').lower() in search_string
                ]
        if len(matching_categories) == 0:
            # add it to the Misc category
            return Category.objects.get_or_create(
                name="Miscellaneous",
                defaults={'slug': 'misc'}
            )[0]
        # return the first match
        return matching_categories[0]

    @staticmethod
    def _get_vendor(vendor_name):
        return Vendor.objects.get_or_create(
            name=vendor_name,
            defaults={'shipping': False}
        )[0]

    @staticmethod
    def _capitalize_name(name):
        return name.replace('-', ' ').replace('_', ' ').title()

    def _update_existing_deal(self, deal_dict):
        self.price = deal_dict.get('price', self.price)
        if self.comment != deal_dict.get['comment']:
            self.comment = deal_dict.get('comment', '')
        self.set_unit_price()
        logger.debug(
            'Existing deal, (pk: %d), updated.',
            self.pk
        )

    @classmethod
    def save_from_dict(cls, deal_dict):
        logger.debug('saving deal from dict: %s', deal_dict)
        deal_dict['category'] = cls._guess_category(deal_dict['name'], deal_dict['url'])
        deal_dict['name'] = cls._capitalize_name(deal_dict['name'])
        existing_deal = cls._find_matching_deal(deal_dict)
        if not existing_deal:
            logger.debug('This is a new deal, saving it')
            current_deal = cls.objects.create(
                name=deal_dict.get('name'),
                slug=deal_dict.get('slug', ''),
                url=deal_dict.get('url'),
                image=Image.from_url(deal_dict.get('image_url', None)),
                price=deal_dict.get('price'),
                comment=''.join(deal_dict.get('comment', [])),
                material_type=deal_dict.get('deal_type', None),
                board_feet=deal_dict.get('boardfeet', None),
                thickness=deal_dict.get('thickness', None),
                length=deal_dict.get('length', None),
                width=deal_dict.get('width', None),
                diameter=deal_dict.get('diameter', None),
                linear_feet=deal_dict.get('linear_feet', None),
                square_feet=deal_dict.get('square_feet', None),
                adhesive_backing=deal_dict.get('adhesive_backing', None),
                unique_lot=deal_dict.get('unique_lot', None),
                category=deal_dict['category'],
                vendor=cls._get_vendor(deal_dict['vendor_name']),
            )
            current_deal.set_unit_price()
        else:
            logger.debug(
                'Existing deal, updating it (pk: %d)',
                existing_deal.pk
            )
            HistoricalDeal().create_historical_deal(existing_deal)
            existing_deal._update_existing_deal(deal_dict)

    def __str__(self):
        return '<Deal: %d, %s>' % (self.pk, self.name)

    class Meta(object):
        unique_together = ((
                               'material_type',
                               'board_feet',
                               'thickness',
                               'length',
                               'width',
                               'diameter',
                               'linear_feet',
                               'square_feet',
                               'adhesive_backing',
                               'unique_lot',
                               'category',
                               'url'
                           ),)

James Bennet 对 Sandwich Heat 的答案的评论指出了解决方案:

In the HistoricalDeal楷模__str__方法,我将一个日期对象传递给''.join([...])(这不是字符串)。只需使用 str() 将该值强制转换为字符串即可消除该问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django:分配外键 - 无法获取类的代表 的相关文章

  • 如何让python优雅地失败?

    我只是想知道如何让 python 在所有可能的错误中以用户定义的方式失败 例如 我正在编写一个处理 大 项目列表的程序 并且某些项目可能不符合我定义的格式 如果 python 检测到错误 它目前只会输出一条丑陋的错误消息并停止整个过程 但是
  • 最小二乘法拟合直线 python 代码

    我有一个由 X 和 Y 坐标组成的散点图 我想使用直线的最小二乘拟合来获得最佳拟合线 直线最小二乘拟合是指 如果 x 1 y 1 x n y n 是测量数据对 则最佳直线是y A Bx 这是我的Python代码 number of poin
  • 正则表达式,选择最接近的匹配

    假设以下单词序列 BLA text text text text text text BLA text text text text LOOK text text text BLA text text BLA 我想做的是将 BLA 中的文本
  • 无法使用 BeautifulSoup 和 Requests 抓取下拉菜单

    我想抓取百年灵网站上的产品页面以获取各种信息 示例页面 https www breitling com gb en watches navitimer b01 chronograph 46 AB0127211C1A1 https www b
  • 如何使用 i18n 切换器将“LANGUAGE_CODE”保存到数据库,以便在 Django 中的不同浏览器中语言不会更改?

    有什么办法可以改变它的值LANGUAGE CODE单击按钮 发送请求 时 settings py 中的变量会动态变化吗 我希望用户设置自己的 默认语言 他们的帐户 现在 用户可以使用下拉列表选择他们的首选语言 并且网站会得到完美的翻译 并且
  • 在Python中以交互方式执行多行语句

    我是 Python 世界的新手 这是我用 Python 编写的第一个程序 我来自 R 世界 所以这对我来说有点不直观 当我执行时 In 15 import math import random random random math sqrt
  • 张量流和线程

    下面是来自 Tensorflow 网站的简单 mnist 教程 即单层 softmax 我尝试通过多线程训练步骤对其进行扩展 from tensorflow examples tutorials mnist import input dat
  • scikit-learn 和tensorflow 有什么区别?可以一起使用它们吗?

    对于这个问题我无法得到满意的答案 据我了解 TensorFlow是一个数值计算库 经常用于深度学习应用 而Scikit learn是一个通用机器学习框架 但它们之间的确切区别是什么 TensorFlow 的目的和功能是什么 我可以一起使用它
  • Tensorflow 不分配完整的 GPU 内存

    Tensorflow 默认分配所有 GPU 内存 但我的新设置实际上只有 9588 MiB 11264 MiB 我预计大约 11 000MiB 就像我的旧设置一样 张量流信息在这里 from tensorflow python client
  • 使用 WSGI 在 Windows XAMPP 中设置 Python 路径

    我正在 Webfaction 上设置实时服务器的开发版本 在本地计算机上的虚拟 Apache 服务器环境 运行没有任何错误 中运行 Django 应用程序 XP 使用 Python 2 6 运行 XAMPP Lite 我可以提交更改通过 G
  • uri 警告中缺少端口:使用 Python OpenCV cv2.VideoCapture() 打开文件时出错

    当我尝试流式传输 ipcam 时 出现了如下所示的错误 tcp 000000000048c640 uri 中缺少端口 警告 打开文件时出错 build opencv modules videoio src cap ffmpeg impl h
  • Jupyter Notebook 中的深色模式绘图 - Python

    我正在使用 Jupyter Notebook 目前正在使用 JupyterThemes 的深色日光主题 我注意到我的绘图不是处于黑暗模式 并且文本仍然是黑色并且在日光照射的背景上无法读取 JupyterThemes 的自述文件建议在 ipy
  • Django Rest Framework POST 更新(如果存在或创建)

    我是 DRF 的新手 我阅读了 API 文档 也许这是显而易见的 但我找不到一个方便的方法来做到这一点 我有一个Answer与 a 具有一对一关系的对象Question 在前端 我曾经使用 POST 方法来创建发送到的答案api answe
  • 更换壳牌管道[重复]

    这个问题在这里已经有答案了 在 subprocess 模块的 Python 2 7 文档中 我找到了以下片段 p1 Popen dmesg stdout PIPE p2 Popen grep hda stdin p1 stdout stdo
  • Django - 隐藏内联标签

    如何在 Django 内联中隐藏标签 当我理解正确时 您可以通过添加属性将 verbose name 设置为模型中的空字符串 verbose name 到你的领域就像 street models CharField max length 5
  • 在 scipy 中创建新的发行版

    我试图根据我拥有的一些数据创建一个分布 然后从该分布中随机抽取 这是我所拥有的 from scipy import stats import numpy def getDistribution data kernel stats gauss
  • Python 导入非常慢 - Anaconda python 2.7

    我的 python import 语句变得非常慢 我使用 Anaconda 包在本地运行 python 2 7 导入模块后 我编写的代码运行得非常快 似乎只是导入需要很长时间 例如 我使用以下代码运行了一个 tester py 文件 imp
  • 更新 SQLAlchemy 中的特定行

    我将 SQLAlchemy 与 python 一起使用 我想更新表中等于此查询的特定行 UPDATE User SET name user WHERE id 3 我通过 sql alchemy 编写了这段代码 但它不起作用 session
  • Pip 无法在 Windows 上安装 Twisted

    我正在尝试在 Windows 8 计算机上安装 Twisted 在 Twisted 官方网站上 只有一个 Windows 版的 Wheel 文件 https twistedmatrix com trac wiki Downloads htt
  • Streamlabs API 405 响应代码

    我正在尝试使用Streamlabs API https dev streamlabs com Streamlabs API 使用 Oauth2 来创建应用程序 因此 首先我将使用我的应用程序的用户发送到一个授权链接 其中包含我的应用程序的客

随机推荐

  • 可以将 ASP.NET 编译为机器代码吗?

    是否可以将 ASP NET Web 应用程序编译为机器语言 如果是这样 有任何性能优势吗 是的你可以 NGen exe http msdn microsoft com en us library 6t9t5wcf aspx 这是一个 Sta
  • window.onbeforeunload 和 window.onunload 在 Firefox、Safari、Opera 中不起作用?

    在我的聊天应用程序中 当我的应用程序关闭时 我需要得到用户的确认 所以我用了window onbeforeunload用于确认警报和window onunload for logout 但这两个功能都可以在 IE 和 Chrome 中使用
  • 有什么方法可以返回对函数中创建的变量的引用吗?

    我想编写一个程序 分两步写入一个文件 在程序运行之前该文件可能不存在 文件名是固定的 问题是OpenOptions new write 可能会失败 在这种情况下 我想调用自定义函数trycreate 这个想法是创建文件而不是打开它并返回句柄
  • C 逗号运算符的使用[重复]

    这个问题在这里已经有答案了 您会看到它在 for 循环语句中使用 但它在任何地方都是合法的语法 您在其他地方发现了它的哪些用途 如果有的话 C 语言 以及 C 历史上是两种完全不同的编程风格的混合体 可以称为 语句编程 和 表达式编程 如您
  • JQuery JSONP 跨域调用不执行任何操作

    每当我通过 jquery 对我设置的任何页面 本地或服务器上 进行 JSONP 调用时 我得到的只是静默处理 Firebug 报告 200 OK 并且响应看起来没问题 我设置了成功时弹出的警报框 或者 失败但两者都没有出现 似乎无论我使用什
  • 使用 .Net 验证路径相等性

    比较 Net 中的两个路径以确定它们是否指向同一文件或目录的最佳方法是什么 如何验证它们是否相同 c Some Dir SOME FILE XXX C SOME DIR some file xxx 更好的是 有没有办法验证这些路径是否指向某
  • jQuery 动态 qtip 显示 div,但每次鼠标悬停都会变得越来越慢

    我使用 jQuery qTip 插件来显示鼠标悬停链接 img 的 div 我写了两个选项来使用 但这两个选项都造成了麻烦 V1 第一个版本仅在我第二次将鼠标移到链接上时才显示工具提示 重复将鼠标悬停在链接上后 脚本似乎变得越来越慢 6 7
  • php unlink() 非ascii字符=找不到文件[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 简短 php unlink 正在处理名称为 asci 的文件 但是 如果我尝试删除名称包括 等的文件 则会出现取消链接生
  • 无法使用ajax从数据库获取数据

    我正在开发 ASP Net MVC 应用程序 我想使用ajax从数据库获取数据 它不会在网页中加载数据 控制台窗口上也没有错误 在 Visual Studio 中也不例外 以下是我的控制器代码 HttpGet public JsonResu
  • 如何使用 HTML 进行 Skype 通话?

    我尝试在我的脚本中插入以下代码片段 通过单击该链接 它应该会呼叫 Skype 帐户 我已经找了好几个小时了 但不明白为什么它不起作用 pre code lt a href quot callTo USERNAME quot gt lt im
  • 市场上的 Github Actions 可以做恶意的事情吗?

    我是 GitHub Actions 的绝对初学者 市场上有可用的操作 这些操作是否可以对我的存储库进行恶意操作 例如 删除我的仓库 将恶意代码提交到我的存储库中 从私人存储库复制内容 答案是 不幸的是 YES 您可以在这里找到一些参考 使用
  • 使用PHPExcel制作自动生成excel文件

    我想让我的 Excel 文件填充从数据库中获取的一些数据 例如某人的姓名和年龄 假设我的数据库中有 10 个人 我希望将这 10 个人包含在我的 Excel 文件中 所以基本上 你会得到 姓名年龄 人1 20岁 人2 25岁 等等 我知道如
  • JavaScript 函数返回 TYPE BOOLEAN 的变量名称,而不是模板文字中的值本身 [重复]

    这个问题在这里已经有答案了 javascript 中是否有一个函数 我可以将变量 而不是值 设置为像 parseVariableName 这样的字符串 例如 在我的场景中 我想要使用布尔变量有一个 动态类名不创建对象 将其作为数组并循环 我
  • 回形针不保存附件

    我是 Rails 和 Web 开发领域的新手 我已经创建了一个用户模型 现在我正在尝试让用户能够使用回形针添加个人资料图片 在我的用户显示页面中 用户可以单击链接打开 编辑 页面 从中可以看到要浏览的表单并选择要上传的图像 单击按钮时 它会
  • 从数据库读取和显示时,“应用程序启动方法中出现异常,java.lang.reflect.InitationTargetException”

    我正在尝试从 MySQL 数据库读取值并将其显示在 JavaFX 的表中 我使用netbeans IDE 当我运行代码时 我得到了标题中提到的异常 我将在下面发布代码 public class ViewSubject extends App
  • 使用 data.table R 选择行或列?

    假设我有一个 data table 例如 library data table RRR lt data table 1 15 runif 15 rgeom 15 0 5 rbinom 15 2 0 5 V1 V2 V3 V4 1 1 0 3
  • Android:MediaPlayer 视频宽高比问题

    我遇到一个无法解决的问题 我正在使用 MediaPlayer 类来播放视频 但是 我总是失去原始的纵横比 这里提到了媒体播放器代码和xml代码 我已经尝试了很多方法但仍然无法解决问题 我需要保持原始的宽高比 我已在 Android 清单文件
  • 按字母顺序排列的列表,轨道上有 ruby

    我正在构建一个按字母顺序排序的列表 并正在寻找一种解决方案来获取数据库结果并按字母顺序排序 任何帮助是极大的赞赏 在上面的nduks的基础上 我喜欢 公司 rb def initial return if name blank name 0
  • Firestore:文档父名称缺少“/”

    我正在使用 jest 对 firestore 执行集成测试 我期望收到包含等于 field1 和 field2 的字段的文档 但是 我收到了以下错误 我尝试在 firecase 控制台中创建复合索引 但问题仍然存在 这种情况似乎只在测试期间
  • Django:分配外键 - 无法获取类的代表

    我在这里问这个问题是因为 在我的搜索中 这个错误通常与查询有关 而不是与外键分配有关 我收到的错误发生在模型的方法中 这是代码 class Deal models Model model fields def update existing