将 Django 从 1.6 更新到 1.8:select_related 中给出的字段名称无效
Update Django from 1.6 to 1.8: Invalid field name(s) given in 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(<django.db.models.query.QuerySet at 0x3b50c10>) 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")
我在 Trace 上的 DetailView 中也有这个错误,DetailView 使用 get_related_selections,当然我得到了 "FieldError: Invalid field name...",为了避免错误,我必须使用 ManyToManyField 而不是 ForeigenKey?
Django 的 select_related()
不适用于反向外键关系。
您可能希望使用 prefetch_related()
在 python 级别预取所有跟踪点。
models.Trace.objects.prefetch_related("trace_points")
Django 1.8 checks that the fields given in select_related are correct。 select_related
方法可用于外键和一对一字段。不可能将它用于反向关系 Trace
回到 TracePoint
.
在以前的 Django 版本中,Trace.objects.select_related("trace_points")
不会引发错误,但 select_related()
调用将无效。
您可以删除 select_related()
调用,或将其替换为 prefetch_related
,这将起作用。
Trace.objects.prefetch_related('trace_points')
我将项目从 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(<django.db.models.query.QuerySet at 0x3b50c10>) 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")
我在 Trace 上的 DetailView 中也有这个错误,DetailView 使用 get_related_selections,当然我得到了 "FieldError: Invalid field name...",为了避免错误,我必须使用 ManyToManyField 而不是 ForeigenKey?
Django 的 select_related()
不适用于反向外键关系。
您可能希望使用 prefetch_related()
在 python 级别预取所有跟踪点。
models.Trace.objects.prefetch_related("trace_points")
Django 1.8 checks that the fields given in select_related are correct。 select_related
方法可用于外键和一对一字段。不可能将它用于反向关系 Trace
回到 TracePoint
.
在以前的 Django 版本中,Trace.objects.select_related("trace_points")
不会引发错误,但 select_related()
调用将无效。
您可以删除 select_related()
调用,或将其替换为 prefetch_related
,这将起作用。
Trace.objects.prefetch_related('trace_points')