将Django从1.6更新到1.8:在select_related中给出了无效的字段名

21 浏览
0 Comments

将Django从1.6更新到1.8:在select_related中给出了无效的字段名

我把项目从Django 1.6.7更新到了1.8.7,但在Django 1.8中我遇到了以下异常,尽管在Django 1.6中这段代码是正确的:

In[2]: from apps.route import models
In[3]: models.Trace.objects.select_related("trace_points")
Out[3]: <repr() failed: django.core.exceptions.FieldError: Invalid field name(s) given in select_related: 'trace_points'. Choices are: user>

我的模型:

class Trace(SocialMixin, models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='traces')
    name = models.CharField(u'Название', max_length=255)
    rating = RatingField(range=5, weight=0)
    start_date = models.DateTimeField(u'Дата старта')
    finish_date = models.DateTimeField(u'Дата окончания', null=True, blank=True)
    distance = models.DecimalField(max_digits=15, decimal_places=6, null=True, blank=True)
    created = models.DateTimeField(auto_now_add=True)
    hits = generic.GenericRelation(HitCount, object_id_field='object_pk')
    description = models.TextField(null=True, blank=True)
class TracePoint(models.Model):
    country = models.ForeignKey(Country, null=True, blank=True)
    city = models.ForeignKey(City, null=True, blank=True)
    trace = models.ForeignKey(Trace, related_name="trace_points")

我也在DetailView中遇到了这个错误,DetailView使用了get_related_selections,当然我得到了\"FieldError: Invalid field name...\",为了避免这个错误,我得使用ManyToManyField代替ForeigenKey?

admin 更改状态以发布 2023年5月23日
0
0 Comments

Django的select_related()对于反向外键关系不起作用。

你可能想使用prefetch_related()来在Python层面预取所有跟踪点。

models.Trace.objects.prefetch_related("trace_points")

0
0 Comments

Django 1.8会检查select_related中指定的字段是否正确。 select_related方法可以用于外键和一对一字段,但不能用于反向关系TraceTracePoint

在Django的先前版本中,Trace.objects.select_related("trace_points")不会引发错误,但是select_related()调用将不起作用。

您可以删除select_related()调用,或将其替换为prefetch_related

Trace.objects.prefetch_related('trace_points')

0