Return 在多对多关系中代理 class,Django 2.0
Return proxied class in many to many relation, Django 2.0
从另一个安装的应用程序,我有这样的模型
class Organization(model.Model):
name = models.CharField(max_length=255, blank=True)
class Person(model.Model):
name = models.CharField(max_length=255, blank=True)
class Membership(model.Model):
organization = models.ForeignKey(
Organization,
related_name='memberships',
# memberships will go away if the org does
on_delete=models.CASCADE,
help_text="A link to the Organization in which the Person is a member.")
person = models.ForeignKey(
Person,
related_name='memberships',
null=True,
# Membership will just unlink if the person goes away
on_delete=models.SET_NULL,
help_text="A link to the Person that is a member of the Organization.")
在我的应用程序中,我需要为某些模型添加一些方法。所以我有一个像
这样的模型
class ProxiedOrganization(other_app.models.Organization):
class Meta:
proxy = True
special_attribute = 'foo'
class ProxiedPerson(other_app.models.Person):
class Meta:
proxy = True
def special_method(self):
print('I do something special')
当我从一个组织获得成员身份时,它们的类型是 other_app.models.Person
。
> type(proxied_org_instance.memberships[0].person)
<class 'other_app.models.Person'>
但是,我希望它们成为我的代理实例 class
> type(proxied_org_instance.memberships[0].person)
<class 'my_app.models.ProxiedPerson'>
有什么好的方法吗?这是我可以用查询管理器做的事情吗?该解决方案必须适用于 Django 2.0。
您需要在 Organization
到 ProxiedPerson
中放置一个外键。例如:
class MemberShip(models.Model):
person = models.ForeignKey(
ProxyPerson,
related_name='memberships',
null=True,
# Membership will just unlink if the person goes away
on_delete=models.SET_NULL,
help_text="A link to the Person that is a member of the Organization.")
或者您可以通过以下方式获取代理人实例:
proxy_person = ProxyPerson.objects.get(pk=proxied_org_instance.memberships[0].person.pk)
或
proxy_persons = ProxyPerson.objects.filter(
pk__in = proxied_org_instance.memberships.all().values_list('person_id')
)
The MyPerson class operates on the same database table as its parent
Person class. In particular, any new instances of Person will also be
accessible through MyPerson, and vice-versa
意味着您可以通过 ProxyPerson
实例访问 Person
实例,反之亦然。
我改编了 Matt Schinckel 的 work on overriding proxy model relations, for a solution that will work with Django 2.0 and 2.1. The code is available as a library on pypi。
从另一个安装的应用程序,我有这样的模型
class Organization(model.Model):
name = models.CharField(max_length=255, blank=True)
class Person(model.Model):
name = models.CharField(max_length=255, blank=True)
class Membership(model.Model):
organization = models.ForeignKey(
Organization,
related_name='memberships',
# memberships will go away if the org does
on_delete=models.CASCADE,
help_text="A link to the Organization in which the Person is a member.")
person = models.ForeignKey(
Person,
related_name='memberships',
null=True,
# Membership will just unlink if the person goes away
on_delete=models.SET_NULL,
help_text="A link to the Person that is a member of the Organization.")
在我的应用程序中,我需要为某些模型添加一些方法。所以我有一个像
这样的模型class ProxiedOrganization(other_app.models.Organization):
class Meta:
proxy = True
special_attribute = 'foo'
class ProxiedPerson(other_app.models.Person):
class Meta:
proxy = True
def special_method(self):
print('I do something special')
当我从一个组织获得成员身份时,它们的类型是 other_app.models.Person
。
> type(proxied_org_instance.memberships[0].person)
<class 'other_app.models.Person'>
但是,我希望它们成为我的代理实例 class
> type(proxied_org_instance.memberships[0].person)
<class 'my_app.models.ProxiedPerson'>
有什么好的方法吗?这是我可以用查询管理器做的事情吗?该解决方案必须适用于 Django 2.0。
您需要在 Organization
到 ProxiedPerson
中放置一个外键。例如:
class MemberShip(models.Model):
person = models.ForeignKey(
ProxyPerson,
related_name='memberships',
null=True,
# Membership will just unlink if the person goes away
on_delete=models.SET_NULL,
help_text="A link to the Person that is a member of the Organization.")
或者您可以通过以下方式获取代理人实例:
proxy_person = ProxyPerson.objects.get(pk=proxied_org_instance.memberships[0].person.pk)
或
proxy_persons = ProxyPerson.objects.filter(
pk__in = proxied_org_instance.memberships.all().values_list('person_id')
)
The MyPerson class operates on the same database table as its parent Person class. In particular, any new instances of Person will also be accessible through MyPerson, and vice-versa
意味着您可以通过 ProxyPerson
实例访问 Person
实例,反之亦然。
我改编了 Matt Schinckel 的 work on overriding proxy model relations, for a solution that will work with Django 2.0 and 2.1. The code is available as a library on pypi。