我有以下四个模型/表:
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
时得到category name
:>>> t_quote.quote.category.translated_category.name
并获得我想要的(类别名称),我仍然需要这样做:
>>> t_quote.quote.category.translated_category.get(
category=t_quote.quote.category.id, language='en').name
我在
prefetch_related
做错了吗?我也无法弄清楚如何使用预取。请帮忙。
最佳答案
您不一定在做与prefetch_related有关的错误,只是您无法从Category访问CategoryTranslation。
这实际上是您要尝试执行的操作,这是无效的:
cat = Category.objects.filter().first()
cat.translated_category
由于类别无法像这样访问CategoryTranslation。
要实现您要执行的操作,您需要更改模型关系,以便ForeignKey位于Category而不是CategoryTranslation上。否则,您可能只需要支付额外查找的费用。
关于python - Django-如何进行prefetch_related?我做错了吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58905360/