2015-07-12 11 views
6

Dla poniższego zestawu modeli (Foo, Bar) można nałożyć regułę sprawdzania poprawności krzyżowej, taką jak ta na pasku Bar.clean następującego fragmentu kodu do django 1.7.Django 1.8.3 - sprawdzanie poprawności modelu z powiązanym obiektem

Ten sam fragment wyrzuca błąd RelatedObjectDoesNotExist w django 1.8.3.

Jaki jest nowy i ulepszony sposób osiągnięcia tego samego wyniku w django 1.8.3?

(podaję kod admin.py tylko pokazać, jak wykorzystywane są te modele.)

models.py

from django.db import models 
from django.core.exceptions import ValidationError 

class Foo(models.Model): 
    name = models.CharField("Name", blank=True, max_length=300) 

class Bar(models.Model): 
    name = models.CharField("Name", blank=True, max_length=300) 
    foo = models.ForeignKey('Foo', verbose_name='Foo') 

    def clean(self): 
     if self.name + self.foo.name != 'FooBar': 
     raise ValidationError('Concatenation should be FooBar.') 

admin.py

from django.contrib import admin 
import models 

class BarInline(admin.TabularInline): 
    model = models.Bar 

class FooAdmin(admin.ModelAdmin): 
    model = models.Foo 
    inlines = [BarInline,] 

site = admin.site 
site.register(models.Foo,FooAdmin) 

Odpowiedz

1

I Dodano prostą modyfikację wyjściową do kodu

def clean(self): 
    print(self.__dict__) 

    if self.name + self.foo.name != 'FooBar': 
    raise ValidationError('Concatenation should be FooBar.') 

Proste instrukcje drukowania wydrukują obiekt Bar przed wykonaniem kodu głównego.

Teraz Przetestowałem kod z Django 1.8.x i mam wyjątek jak wspomniano jest to wynik:

{'_state': <django.db.models.base.ModelState object at 0x7ff55cd30710>, 'id': None, 'foo_id': None, 'name': 'Bar 1'} 

Teraz Przetestowałem go ponownie z Django 1.7.x i to działa ok, wynik wyjściowy:

{'_foo_cache': <Foo: Foo object>, 'name': 'Bar 1', 'id': None, 'foo_id': None, '_state': <django.db.models.base.ModelState object at 0x7f731151c9e8>} 

Jak można zauważyłem foo_id w obu przypadkach w None ale co robi magia jest _foo_cache rzeczą, która została usunięta w Django 1.8

Substytut, że mogę zaproponować Ci się przenieść do walidacji formularzy

wprowadzeniu tych zmian: admin.py

class BarInline(admin.TabularInline): 
    model = Bar 
    form = BarForm 

forms.py

class BarForm(forms.models.ModelForm): 
    class Meta: 
     model = Bar 
     fields = ('name',) 

    def clean(self): 
     data = self.cleaned_data  
     if not data['name'] + data['foo'].name == "foobar": 
     raise ValidationError('Concatenation should be FooBar.') 
+1

Ta introspekcja była bardzo przydatna, Dziękuję Ci. Czy masz pojęcie, dlaczego programiści Django usuną możliwość wyszukiwania powiązanych obiektów z metody clean(), która wydaje się być przydatna? –