سؤال

أنا مبتدئ إلى حددي إلى FormalChemy ويبدو أنني لا أحصل على شيء ما. لدي نموذج Sqlalchemy المعرفة مثل هذا:

...
class Device(meta.Base):
    __tablename__ = 'devices'

    id = sa.Column('id_device', sa.types.Integer, primary_key=True)
    serial_number = sa.Column('sn', sa.types.Unicode(length=20), nullable=False)
    mac = sa.Column('mac', sa.types.Unicode(length=12), nullable=False)
    ipv4 = sa.Column('ip', sa.types.Unicode(length=15), nullable=False)
    type_id = sa.Column('type_id', sa.types.Integer,
                        sa.schema.ForeignKey('device_types.id'))
    type = orm.relation(DeviceType, primaryjoin=type_id == DeviceType.id)
...

ثم في جهاز التحكم (الصلب) الخاص بي، أقوم بإنشاء نموذج رسمي مثل هذا:

c.device = model.meta.Session.query(model.Device).get(device_id)
fs = FieldSet(c.device, data=request.POST or None)
fs.configure(options=[fs.ipv4.label(u'IP').readonly(),
                      fs.type.label(u'Type').with_null_as((u'—', '')),
                      fs.serial_number.label(u'S/N'),
                      fs.mac.label(u'MAC')])

تقول الوثائق أن "بشكل افتراضي، وليس الأعمدة الفارغة مطلوبة. يمكنك فقط إضافة مطلوبة - NESS، وليس إزالته."، لكنني أريد السماح بأسلوت فارغة غير فارغة، والتي validators.required لا يعرف. هل هناك شيء مثل blank=True, null=False في django؟

أن تكون أكثر دقة، أريد منصة مخصصة مثل واحد أدناه، إما السماح بأسلوت فارغة type=None أو جميع القيم التي سيتم تعيينها غير فارغة وغير فارغة:

# For use on fs.mac and fs.serial_number.
# I haven't tested this code yet.
def required_when_type_is_set(value, field):
    type_is_set = field.parent.type.value is not None:
    if value is None or (type_is_set and value.strip() = ''):
        raise validators.ValidationError(u'Please enter a value')

إذا كان ذلك ممكنا، أود الامتناع عن الترقيع القرد formalchemy.validators.required أو غيرها من kludges. لا أريد ضبط nullable=True في الحقول النموذجية، لأنه لا يبدو أنه حل مناسب أيضا.

ما هي الطريقة الصحيحة للتحقق من صحة النموذج في هذه الحالة؟ شكرا لأي اقتراحات مقدما.

هل كانت مفيدة؟

المحلول

أخيرا وجدت A (klugde، ولكن يبدو أن هذا هو الخيار الوحيد العاقل) للقيام بذلك.

  fs.serial_number.validators.remove(formalchemy.validators.required)
  fs.mac.validators.remove(formalchemy.validators.required)

(فيما يتعلق بالخدمة الخاصة بي) لاحظ، الذي سوف بالكامل تخطي كل التحقق من صحة عندما تكون القيمة None, ، لأنه، من خلال الاتفاقية، لن يمر None للمصادف (باستثناء validators.required, ، وهو أمر مشدود). لقد قدمت تذكرة طلب تعزيز تحاول حل هذا: http://code.google.com/p/formalchemy/issues/detail؟id=117.

نصائح أخرى

هل يمكنك أن تشرح لماذا nullable=True لن يكون الحل؟

بالنسبة لي أنه يبدو عديم الفائدة لتخزين سلاسل فارغة في قاعدة البيانات ولن أشجعها. إذا لم تكن هناك بيانات من اختيار النوع الأكثر كفاءة لقاعدة البيانات.

أنا شخصيا أعتقد أن حل Django في حالة السلاسل خاطئة لأنه لا يدعم حقا فارغة في charfields. إذا كنت ترغب في تخزين NULL في Charfield، فسيتعين عليك القيام بذلك يدويا في التعليمات البرمجية.

هذا هو بالضبط نفس المشكلة التي أواجهها، حيث أكتبت في كثير من الأحيان واجهات لقواعد البيانات الحالية وتريد استخدام dresolionChemy ولكن في نهاية المطاف في النهاية لإزالة "المطلب" يدويا لأنني غير قادر على تغيير قاعدة البيانات.

يمكنك تعليم FormalChemy عدم استبدال مدخلات فارغة مع لا شيء عن طريق تغيير null_as سمة العمود.

 whatever = Column(Unicode(999), required=False, null_as=("","\0"), nullable=False, default="", doc="Whatever for ever")

سوف DronalChemy محل الإدخال يساوي العضو الثاني في null_as tuple مع None. وبعد (الأول هو نص العرض للاختيار وحقول مماثلة.)

إذا قمت بتعيين ذلك إلى سلسلة لا يمكن للمستخدم إدخالها، فلن يحدث هذا أبدا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top