我有以下四个模型/表:

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/

10-12 22:18