擅长:python、mysql、java
<p>您可以创建<code>SelfRefrencingModel</code>的<a href="https://docs.djangoproject.com/en/1.8/topics/db/models/#proxy-models" rel="nofollow">proxy model</a>,并覆盖默认的<a href="https://docs.djangoproject.com/en/1.8/topics/db/managers/#modifying-initial-manager-querysets" rel="nofollow">manager</a>。然后在<code>ManyToManyField</code>中使用此代理模型。在</p>
<p>子类化<code>ManyToManyField</code>对您没有帮助,因为对于结果查询集,<code>ManyRelatedManger</code>负责。在</p>
<p>代理模型方法:</p>
<pre><code>from django.db import models
class A(models.Model):
children = models.ManyToManyField('AProxy')
name = models.TextField()
deleted = models.NullBooleanField(null=True)
class FilterDeletedManager(models.Manager):
def get_queryset(self):
qs = super(FilterDeletedManager, self).get_query_set()
return qs.filter(deleted__isnull=True)
class AProxy(A):
objects = FilterDeletedManager()
class Meta:
proxy = True
</code></pre>
<p>这种方法需要注意的是,django现在需要<code>AProxy</code>个实例作为<code>children</code>字段。在</p>
<p>所以,也许更好的可读性和可维护性方法是在<code>__init__</code>中添加另一个属性。在</p>
^{pr2}$