python - नापसंद फैक्ट्री के लिए यह विकल्प क्यों नहीं है।



flask sqlalchemy (1)

फैक्टरी बॉय ने set_creation_function (ChangeLog 2.6.1 देखें) का बहिष्कार किया और डेवलपर्स की सिफारिश की

SomeFactory की _create () विधि के ओवरराइड के साथ factory.set_creation_function (SomeFactory, creation_function) बदलें।

मेरे पास 1) डेरिवेटिव फ़ैक्टरी क्लासेस की एक संख्या है और ii) मेरे डीबी सत्र दूसरे मॉड्यूल में तत्काल दिए गए हैं, इसलिए मैंने काम के उदाहरण की जगह https://github.com/mattupstate/overholt को दूसरे कोड ब्लॉक के साथ बदलने की कोशिश की। PyCharm मुझे चेतावनी दे रहा है कि "db" आयात का उपयोग नहीं किया जा रहा है, इसलिए मुझे संदेह है कि जब मैं sqlalchemy_session सेट किया गया हो, तो इसे ठीक से ठीक नहीं किया जा सकता है?

नोजेट्स के साथ काम करना 1.3.7 (लेकिन फैक्टरीबॉय की सेट_क्रिएशन_ फ़ंक्शन को अब पदावनत किया गया है):

from myapp.core import db

def create_sqlalchemy_model_function(class_to_create, *args, **kwargs):
    entity = class_to_create(**kwargs)
    db.session.add(entity)
    db.session.commit()
    return entity

Factory.set_creation_function(create_sqlalchemy_model_function)

Nosetests 2.x के साथ काम नहीं कर रहा है (जैसे डीबी को ठीक से संदर्भित नहीं किया जा रहा है?)

from factory.alchemy import SQLAlchemyModelFactory as Factory
from myapp.core import db

class Factory():
    class Meta:
        sqlalchemy_session = db.session

    def _create(cls, model_class, *args, **kwargs):
        entity = model_class(*args, **kwargs)
        db.session.add(entity)
        db.session.commit()
        return entity

आपके नमूना न-कार्य कोड वाले दो प्रमुख मुद्दे:

  • वर्ग SQLAlchemyModelFactory क्लास से प्राप्त किया जाना चाहिए
  • _create() विधि classmethod रूप में परिभाषित किया जाना चाहिए

फिक्स्ड संस्करण:

from factory.alchemy import SQLAlchemyModelFactory as Factory
from myapp.core import db

class MyFactory(Factory):
    class Meta:
        sqlalchemy_session = db.session

    @classmethod
    def _create(cls, model_class, *args, **kwargs):
        entity = model_class(*args, **kwargs)
        db.session.add(entity)
        db.session.commit()
        return entity

यहां मॉडल कारखाने का एक नमूना भी _create() विधि को ओवरराइड करते _create()





nose