我有这四个模型/表格:
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/