我正试图找出如何在Django中使用代理类。我想要接收一个查询集,其中每个对象都属于一个公共超类的代理类,这样我就可以运行具有相同名称的自定义子类方法,而我的控制器逻辑不需要知道或关心它使用的是哪种代理模型。我不想做的一件事是将信息存储在多个表中,因为我希望有统一的标识符以便于引用/管理。在
我对django/python非常陌生,所以我很乐意听到其他方法来完成我正在尝试的工作。在
以下是我所拥有的:
TYPES = (
('aol','AOL'),
('yhoo','Yahoo'),
)
class SuperConnect(models.Model):
name = models.CharField(max_length=90)
type = models.CharField(max_length=45, choices = TYPES)
connection_string = models.TextField(null=True)
class ConnectAOL(SuperConnect):
class Meta:
proxy = True
def connect(self):
conn_options = self.deconstruct_constring()
# do special stuff to connect to AOL
def deconstruct_constring(self):
return pickle.loads(self.connection_string)
class ConnectYahoo(SuperConnect):
class Meta:
proxy = True
def connect(self):
conn_options = self.deconstruct_constring()
# do special stuff to connect to Yahoo
def deconstruct_constring(self):
return pickle.loads(self.connection_string)
现在我想做的是:
^{pr2}$我环顾四周,发现一些黑客,但他们看起来有问题,可能需要我去数据库的每一个项目,以检索我可能已经拥有的数据。。。在
有人请救救我:)否则我要用这个黑客攻击:
class MixedQuerySet(QuerySet):
def __getitem__(self, k):
item = super(MixedQuerySet, self).__getitem__(k)
if item.atype == 'aol':
yield(ConnectAOL.objects.get(id=item.id))
elif item.atype == 'yhoo':
yield(ConnectYahoo.objects.get(id=item.id))
else:
raise NotImplementedError
def __iter__(self):
for item in super(MixedQuerySet, self).__iter__():
if item.atype == 'aol':
yield(ConnectAOL.objects.get(id=item.id))
elif item.atype == 'yhoo':
yield(ConnectYahoo.objects.get(id=item.id))
else:
raise NotImplementedError
class MixManager(models.Manager):
def get_query_set(self):
return MixedQuerySet(self.model)
TYPES = (
('aol','AOL'),
('yhoo','Yahoo'),
)
class SuperConnect(models.Model):
name = models.CharField(max_length=90)
atype = models.CharField(max_length=45, choices = TYPES)
connection_string = models.TextField(null=True)
objects = MixManager()
class ConnectAOL(SuperConnect):
class Meta:
proxy = True
def connect(self):
conn_options = self.deconstruct_constring()
# do special stuff to connect to AOL
def deconstruct_constring(self):
return pickle.loads(self.connection_string)
class ConnectYahoo(SuperConnect):
class Meta:
proxy = True
def connect(self):
conn_options = self.deconstruct_constring()
# do special stuff to connect to Yahoo
def deconstruct_constring(self):
return pickle.loads(self.connection_string)
正如您在问题中提到的,解决方案的问题是它为每个对象生成一个SQL查询,而不是使用一个SQL
in = (id1, id2)
查询。代理模型不能包含额外的数据库字段,因此不需要额外的SQL查询。在相反,您可以使用
__class__
属性将超级连接对象转换为SuperConnect.__init__
中的适当类型:不需要自定义管理器或查询集,在初始化超级连接对象时设置正确的类型。在
把所有的逻辑放在一个类里怎么样。像这样:
最后,你有了你的
type
字段,你应该能够做大多数(如果不是全部)的事情,你可以用单独的代理类来做。在如果这种方法不能解决您的特定用例,请澄清。在
相关问题 更多 >
编程相关推荐