Python Django-如何将自定义对象指定为模型属性并在该对象中获取该模型实例?
我想从模型中分离一些逻辑并将其分组到属性中,就像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
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
作为描述符来编写。。。