Python Django-如何将自定义对象指定为模型属性并在该对象中获取该模型实例?

Python Django-如何将自定义对象指定为模型属性并在该对象中获取该模型实例?,python,django,Python,Django,我想从模型中分离一些逻辑并将其分组到属性中,就像Django对模型管理器(objectproperty)所做的那样。事实上,类似于ForeignKey但没有数据库表示 我有这样的想法: class Remote(object): def __init(self, *args, **kwargs) self.post = ... # how to get to post instance? def synchronize(self): # this

我想从模型中分离一些逻辑并将其分组到属性中,就像Django对模型管理器(
object
property)所做的那样。事实上,类似于
ForeignKey
但没有数据库表示

我有这样的想法:

class Remote(object):
    def __init(self, *args, **kwargs)
        self.post = ... # how to get to post instance?

    def synchronize(self):
       # this function requires Post object access
       print(self.post.name)

class Post(models.Model):
    name = models.CharField(max_length=100)
    remote = Remote()

...

for post in Post.objects.all():
    post.remote.synchronize()
class Remote:
    def __init__(self, post)
        self.post = post

    def synchronize(self):
       print(self.post.name)


class RemoteDescriptor:
    def __get__(self, obj):
        if not obj:
            return self
        remote = getattr(obj, '_remote', None)
        if not remote:
            remote = Remote(obj)
            obj._remote = remote
        return remote


class Post(models.Model):
    name = models.CharField(max_length=100)
    remote = RemoteDescriptor()
问题

如何修改上述代码以访问
Remote
对象中的
Post
对象

附加问题


是否可以确定是否从
Post
实例(
Post.Remote…
–如上所述)或
Post
类(
Post.Remote…
)调用了
Remote
对象?

您在这里想要的东西可以通过以下方法实现

为了让它工作,您需要在类中定义一个
\uuuu get\uuuu
方法,该方法要作为另一个类的属性进行访问

您的案例的一个简单示例如下所示:

class Remote(object):
    def __init(self, *args, **kwargs)
        self.post = ... # how to get to post instance?

    def synchronize(self):
       # this function requires Post object access
       print(self.post.name)

class Post(models.Model):
    name = models.CharField(max_length=100)
    remote = Remote()

...

for post in Post.objects.all():
    post.remote.synchronize()
class Remote:
    def __init__(self, post)
        self.post = post

    def synchronize(self):
       print(self.post.name)


class RemoteDescriptor:
    def __get__(self, obj):
        if not obj:
            return self
        remote = getattr(obj, '_remote', None)
        if not remote:
            remote = Remote(obj)
            obj._remote = remote
        return remote


class Post(models.Model):
    name = models.CharField(max_length=100)
    remote = RemoteDescriptor()
说明

在上面的代码中,每次调用
Post
模型的属性remote时,都会调用
RemoteDescriptor
\uu get\uu
方法。obj的第一个检查是确保描述符是从其他对象调用的,而不是直接调用的。这里需要两个类Remote和RemoteDescriptor,以便您能够在描述符中添加自定义方法,这些方法可以使用dot访问(例如
post.Remote.calculate()

还要注意的是,我将
Remote
的实例放在第一次调用和所有后续调用的Post目录中,对象将从那里返回


您还应该检查RealPython上的描述符。

您必须将
Remote
作为描述符来编写。。。