python - 如何进行prefetch_相关?我做错了吗?

标签 python django

我有这四个模型/表格:

class Category(models.Model):
    image = models.ImageField(upload_to="images/")
    position = models.IntegerField()


class CategoryTranslation(models.Model):
    name = models.CharField(max_length=32)
    language = models.CharField(max_length=2)
    category = models.ForeignKey(Category,
                                 related_name="translated_category",
                                 on_delete=models.CASCADE)


class Quote(models.Model):
    num_views = models.IntegerField()
    category = models.ForeignKey(Category,
                                 related_name="quote_category",
                                 on_delete=models.CASCADE)


class QuoteTranslation(models.Model):
    quote_text = models.TextField(max_length=512)
    language = models.CharField(max_length=2)
    quote = models.ForeignKey(Quote,
                              related_name="translated_quote",
                              on_delete=models.CASCADE)

我想预取所有相关数据,我想出了这个:

 t_quote = QuoteTranslation.objects.filter(
        language='en'
    ).prefetch_related(
        'quote__category__translated_category'
    ).first()

有了这个我可以得到:

>>> t_quote.quote_text
>>> t_quote.quote.num_views
>>> t_quote.quote.category.image

没有任何其他查询,但当我尝试获取类别名称时,我得到None:

>>> t_quote.quote.category.translated_category.name

为了得到我想要的东西(类别名称)我仍然需要这样做:

>>> t_quote.quote.category.translated_category.get(
      category=t_quote.quote.category.id, language='en').name

prefetch_lated做错了吗?我也不知道如何使用 Prefetch 来做到这一点。

最佳答案

您不一定会做 prefetch_lated 错误,只是您无法从 Category 访问 CategoryTranslation。

这本质上是您想要做的事情,但这是无效的:

cat = Category.objects.filter().first()
cat.translated_category

因为类别无法像这样访问 CategoryTranslation。

要实现您想要做的事情,您需要更改模型关系,以便外键位于类别而不是类别翻译上。否则,您可能只需要支付额外查找的费用。

关于python - 如何进行prefetch_相关?我做错了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58905360/

相关文章:

python - 如何在 python 中打印变量名?

python3 记录器 - UnicodeEncodeError

django - 未配置电子邮件时,如何使带有密码重置的django应用正常出现故障?

javascript - Django POST 请求中禁止的 CSRF token 丢失或不正确,即使我在表单中有 csrf token

python - 如何重新排列包含关系运算符的 sympy 表达式

c# - 使用openCV和OCR从不规则表格中提取数据

python - 如何自动备份 Azure Web Apps 上托管的 Django 应用程序中的 db.sqlite3 文件?

django - PostgreSQL 加载 back.json 文件时出现重复 key 问题

python - 在 Django-Oscar 中通过 Paypal 处理付款

python - 程序在将字典传递给函数参数时显示 TypeError