2016-01-25 56 views
2

我有兩個彼此相關的物體。我希望能夠通過相關屬性訪問一個對象。棉花糖的圓形進口

E.g. A.b_relationship.obj.some_property

如何在不創建循環導入的情況下執行此操作?

# lib.py 
class Relationship(object): 

    def __init__(self, obj): 
     self.obj = obj 


# a.py 
class A(object): 
    b_relationship = Relationship(B) 

# b.py 
class B(object): 
    a_relationship = Relationship(A) 

爲清楚起見,我添加了這個附加的例子。顯然SQLAlchemy已經用backref屬性解決了這個問題。我不確定在沒有打破它的運作方式的情況下將這種東西實施到棉花糖中是多麼可行。也許我需要改變我的想法?

from marshmallow import Schema 
from marshmallow.fields import String 

from project.database import db 


class PersonModel(db.Model): 
    name = db.Column(db.String) 


class PetModel(db.Model): 
    name = db.Column(db.String) 
    owner = db.relationship('PersonModel', backref='pets') 


class PersonSchema(Schema): 
    name = fields.String(init_arg='some value') 
    pets = fields.Relationship(related_schema=PetSchema) 


class PetSchema(Schema): 
    name = fields.String() 
    owner = fields.Relationship(related_schema=PersonSchema) 
+2

做一個'__init__'並在那裏導入'A'和'B'。然後,您可以避免在a.py和b.py中導入循環。 [這可能是相關的](http://stackoverflow.com/q/13444900/198633) – inspectorG4dget

+1

你說你有兩個彼此相關的對象,但你在課堂上設置關係。雖然類確實是對象,但這似乎不是一個有用的創建鏈接。你想讓A的一個實例與B的一個實例鏈接,反之亦然,或者你想讓這些類鏈接起來嗎?一個級別的鏈接是相當無用的。另外,這些類的實例是如何創建的?它們是一起存在還是獨立創造的? – user2357112

+0

@ user2357112這些類本身不應該鏈接在一起。他們不關心對方。它需要鏈接的_relationship屬性。我稍後鍵入這些字段,然後使用鏈接的obj進行一些計算。 –

回答

4

從這裏: http://marshmallow.readthedocs.org/en/latest/nesting.html#two-way-nesting

看到一個字符串的方式用於類; AuthorSchema指的是 'BookSchema':

class AuthorSchema(Schema): 
    # Make sure to use the 'only' or 'exclude' params 
    # to avoid infinite recursion 
    books = fields.Nested('BookSchema', many=True, exclude=('author',)) 
    class Meta: 
     fields = ('id', 'name', 'books') 

class BookSchema(Schema): 
    author = fields.Nested(AuthorSchema, only=('id', 'name')) 
    class Meta: 
     fields = ('id', 'title', 'author') 

我在你的情況假設,你想要做同樣的事情many=False。我從來沒有使用棉花糖,但在Django,它是相似的,我們使用類路徑,如「my_app.MyClass」而不是MyClass,以避免循環導入。

+0

感謝芽!我沒有意識到棉花糖已經有了這個功能。這就是我所假設的。 –

1

你可以實現一個RelationshipManager(又名註冊表),它可以是有關係的一部分,所有類都必須與註冊。

Relationship初始化程序可以取其相關類的名稱而不是實際的類對象。

最後,關係類本身可以從初始化給出的名稱(通過管理器)延遲加載與其相關的實際類。