2016-05-05 10 views
4

Ich aktualisiere das Projekt von Django 1.6.7 bis 1.8.7 und ich habe folgende Ausnahme mit Django 1.8, obwohl mit Django 1.6 es Code war rechts: Update Django von 1.6 bis 1.8: Ungültige Feldname (n) in 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> 

Meine Modelle:

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") 

ich habe auch diesen Fehler in Detailview auf Trace verwendet Detailview get_related_selections, und natürlich bekam ich "FieldError: ungültigen Feldnamen ...", zu Fehler vermeiden Ich muss ManyToManyField anstelle von ForeigenKey verwenden?

+0

Der Code in '[3]' macht keinen Sinn, da mehr als ein 'TracePoint' mit einem' Trace' verknüpft sein kann. –

+0

Ja, es kann mehr TracePoint geben als einer, der mit einem Trace verknüpft ist, aber im alten Django hat es wirklich funktioniert ... – Petr

+1

Das wäre dann ein Bug in der alten Version. –

Antwort

7

Django 1.8 checks that the fields given in select_related are correct. Die Methode select_related kann für Fremdschlüssel und Eins-zu-eins-Felder verwendet werden. Es ist nicht möglich, es für die umgekehrte Beziehung Trace zurück zu TracePoint zu verwenden. In früheren Versionen von Django würde Trace.objects.select_related("trace_points") keinen Fehler auslösen, aber der select_related() Aufruf hätte keine Auswirkung.

Sie können entweder den select_related() Anruf entfernen oder durch prefetch_related ersetzen, der funktioniert.

Trace.objects.prefetch_related('trace_points') 
3

Djangos select_related() funktioniert nicht für Rückwärts-Fremdschlüsselbeziehungen.

Sie können prefetch_related() zum Vorabholen aller Trace-Punkte auf Python-Ebene verwenden.

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