9

W starym google appengine datastore API "required" i "default" może być używane razem dla definicji właściwości. Korzystanie NDB dostajęDlaczego wymagane i domyślne są wykluczające się wzajemnie w ndb?

ValueError: repeated, required and default are mutally exclusive. 

kod próbki:

from google.appengine.ext import ndb 
from google.appengine.ext import db 

class NdbCounter(ndb.Model): 
    # raises ValueError 
    count = ndb.IntegerProperty(required=True, default=1) 

class DbCounter(db.Model): 
    # Doesn't raise ValueError 
    count = db.IntegerProperty(required=True, default=1) 

chcę instancję licznik bez konieczności określania wartości. Chcę też uniknąć sytuacji, w której ktoś zastąpi tę wartość None. Powyższy przykład jest skonstruowany. Prawdopodobnie mógłbym żyć bez wymaganego atrybutu i zamiast tego dodać metodę increment(). Nadal nie widzę powodu, dla którego wymagane i domyślne wzajemnie się wykluczają.

Czy to błąd lub funkcja?

Odpowiedz

10

Myślę, że masz rację. Być może byłem zdezorientowany, gdy piszę tę część kodu. Ma sens, że "required = True" oznacza "nie pozwalaj na zapisanie wartości None", więc powinno być możliwe połączenie tego z wartością domyślną. Proszę złożyć żądanie funkcji w module śledzącym NDB: http://code.google.com/p/appengine-ndb-experiment/issues/list

Należy pamiętać, że w przypadku powtarzających się właściwości rzeczy są bardziej skomplikowane, powtarzanie będzie prawdopodobnie nadal niezgodne z wymaganiami lub domyślnymi, nawet jeśli powyższa funkcja zostanie zaimplementowana.

+0

Dzięki. Utworzyłem problem http://code.google.com/p/appengine-ndb-experiment/issues/detail?id=236 – bastian

0

Nie jestem pewien, co było zamierzone, heres jest „wyjaśnienie” od appengine.ext.ndb.model.py:

The repeated, required and default options are mutually exclusive: a 
repeated property cannot be required nor can it specify a default 
value (the default is always an empty list and an empty list is always 
an allowed value), and a required property cannot have a default. 

Pamiętaj, że NDB ma jakąś inną naprawdę irytujące zachowanie (SMS> 500 nie Bajty możliwe bez patchowania małpy w modelu expando, filtrowanie przez .IN ([]) podnosi wyjątek, ..). Więc jeśli nie potrzebujesz ulepszeń szybkości przez buforowanie, powinieneś rozważyć pozostanie przy atm.dodatku ext.db.

+0

To wydaje się być konceptualnym błędem. Nie widzę powodu dla tego ograniczenia. Ograniczenie powinno być takie, że domyślnie nie może być Brak, jeśli jest to wymagane = Prawda. – bastian

+0

dla mnie to ma sens, jak to jest. Jeśli potrzebujesz wartości, to po co zawracać sobie głowę określaniem wartości domyślnej, ponieważ równie dobrze możesz nie mieć wymaganego = Prawda w tym przypadku (tak jakbyś zrobił tylko i nie tworzył i zapisywał model, który będzie działał tak, jak ma wartość domyślną). Wymagane = True jest dla mnie przypomnieniem, że jeśli spróbuję zapisać ten model bez wartości w tym polu, to się nie powiedzie, natomiast jeśli podam domyślną wartość, to nigdy nie zawiedzie i to dla mnie jest punktem wymagane. –

Powiązane problemy