2016-05-05 15 views
4

Django 1.6.7から1.8.7へのプロジェクトの更新を行いますが、Django 1.8では次の例外があります。右:Djangoを1.6から1.8に更新:select_relatedで無効なフィールド名

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> 

マイモデル: ":無効なフィールド名... FieldErrorを"、に

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がget_related_selectionsを使用し、もちろん私が得た、トレースにDetailViewにこのバグを持っていますエラーを避けるForeigenKeyの代わりにManyToManyFieldを使用する必要がありますか?

+0

'[3]'のコードは、 'Trace'に関連付けられた複数の' TracePoint'が存在する可能性があるので意味がありません。 –

+0

はい、トレースに関連付けられているTracePointより多くのTracePointが存在する可能性がありますが、古いDjangoでは実際に働いていました... – Petr

+1

これは古いバージョンのバグです。 –

答えて

7

Django 1.8 checks that the fields given in select_related are correctselect_relatedメソッドは、外部キーと1対1のフィールドに使用できます。逆の関係Traceに戻ってTracePointに戻すことはできません。

以前のバージョンのDjangoでは、Trace.objects.select_related("trace_points")はエラーを発生しませんでしたが、select_related()呼び出しは効果がありません。

select_related()コールを削除するか、prefetch_relatedと置き換えることができます。

Trace.objects.prefetch_related('trace_points') 
3

Djangoのselect_related()は、後方の外部キーの関係では機能しません。

Pythonレベルですべてのトレースポイントをプリフェッチする場合は、prefetch_related()を使用します。

models.Trace.objects.prefetch_related("trace_points") 
関連する問題