管理或视图中的自引用对称多对多 Django 模型
Self Referencing Symmetrical Many to Many Django Model in Admin or View
如何在 M2M django 模型中获得对称自引用的另一面?
假设我们正在制作零件目录,我们有很多 Part
,我们想要一个 Interchange
来显示哪些零件可以代替另一个:
class Part(models.Model):
name = models.CharField(max_length=300)
number = models.CharField(max_length=200, default 'because numberphiles like more ids')
…
interchanges = models.ManyToManyField("self",
through='Interchange',
symmetrical=False,
# + sign per http://charlesleifer.com/blog/self-referencing-many-many-through/
# I have tried without the plus t omaintain the references as well, but can't seem to understand the difference(s)
related_name="interchanges_to+",
# through_fields per docs
through_fields=('reference', 'interchange')
)
# per this http://charlesleifer.com/blog/self-referencing-many-many-through/
def add_interchange(self, part, symm=True):
interchange = models.Interchange.objects.get_or_create(
reference_part=self,
interchange_part=part)
if symm:
# avoid recursion by passing `symm=False`
part.add_interchange(self, False)
return interchange
def remove_interchange(self, part, symm=True):
models.Interchange.objects.filter(
reference_part=self,
interchange_part=part).delete()
if symm:
# avoid recursion by passing `symm=False`
part.remove_interchange(self, False)
def get_interchanges(self):
return ", ".join([str(p) for p in self.interchanges.filter(interchange_part__reference=self)])
def get_references(self):
return …?
# This is where I don't know how to get the Parts that are referring to it as being an interchange
class Interchange(models.Model):
reference = models.ForeignKey(Part, related_name="reference_part")
interchange = models.ForeignKey(Part, related_name="interchange_part")
# just to confirm we have a M2M table, we will add a foregin key to a User if this interchange has been personally verified
confirmed_by = models.ForeignKey(User, null=True, blank=True)
# … others if needed
class Meta:
# because self-referencing, in this case, is silly, we make sure each part references another part
unique_together = ('reference', 'interchange')
在 Django 管理中,我有:
@admin.register(app.Part)
class PartAdmin(admin.ModelAdmin):
list_display = ['name',
'number',
# ▼ I can see the Parts itself Interchanges to
'get_interchanges',
# ▼ I can not see the Parts that reference itself as being an Interchange
'get_references']
管理员中的零件模型供参考...
这是我的资料:
这是我想要得到的:
作为确认,管理中的交换模型:
如何获得对称自引用 M2M django 模型的另一面?
如何 return Part
在交换 table 中但在参考(第一)列中
备注:
- 使用 Django 1.11
- 我知道根据 docs
通过模型使用 M2M 时需要 False
的对称性
- This 不错的文章帮助我走得很远,但在管理员中,我似乎无法让
interchange_part
在管理员中显示其 reference_part
页面(因此我什至没有尝试在具有 different/particular 功能的视图中查看是否可行)
- 在 docs 中,它指出
through_keys
的元组的第二部分称为 target
模型,但我找不到引用第一部分的内容
- 我确信有一种方法可以深入多个层次,即如果第一个部分交换为 2,并且 2 => 3,那么 1 应该列出 2 和 3(但这不是重点片刻)
- 请指正我的误解,谢谢:)
如果 manytomany 具有通过 table 和 related_name
参数并且不包含 +
,那么您可以直接访问该集:
def get_references(self):
return ", ".join([str(p) for p in self.interchanges_to.all()])
请注意,我不确定 performance/complexity
如何在 M2M django 模型中获得对称自引用的另一面?
假设我们正在制作零件目录,我们有很多 Part
,我们想要一个 Interchange
来显示哪些零件可以代替另一个:
class Part(models.Model):
name = models.CharField(max_length=300)
number = models.CharField(max_length=200, default 'because numberphiles like more ids')
…
interchanges = models.ManyToManyField("self",
through='Interchange',
symmetrical=False,
# + sign per http://charlesleifer.com/blog/self-referencing-many-many-through/
# I have tried without the plus t omaintain the references as well, but can't seem to understand the difference(s)
related_name="interchanges_to+",
# through_fields per docs
through_fields=('reference', 'interchange')
)
# per this http://charlesleifer.com/blog/self-referencing-many-many-through/
def add_interchange(self, part, symm=True):
interchange = models.Interchange.objects.get_or_create(
reference_part=self,
interchange_part=part)
if symm:
# avoid recursion by passing `symm=False`
part.add_interchange(self, False)
return interchange
def remove_interchange(self, part, symm=True):
models.Interchange.objects.filter(
reference_part=self,
interchange_part=part).delete()
if symm:
# avoid recursion by passing `symm=False`
part.remove_interchange(self, False)
def get_interchanges(self):
return ", ".join([str(p) for p in self.interchanges.filter(interchange_part__reference=self)])
def get_references(self):
return …?
# This is where I don't know how to get the Parts that are referring to it as being an interchange
class Interchange(models.Model):
reference = models.ForeignKey(Part, related_name="reference_part")
interchange = models.ForeignKey(Part, related_name="interchange_part")
# just to confirm we have a M2M table, we will add a foregin key to a User if this interchange has been personally verified
confirmed_by = models.ForeignKey(User, null=True, blank=True)
# … others if needed
class Meta:
# because self-referencing, in this case, is silly, we make sure each part references another part
unique_together = ('reference', 'interchange')
在 Django 管理中,我有:
@admin.register(app.Part)
class PartAdmin(admin.ModelAdmin):
list_display = ['name',
'number',
# ▼ I can see the Parts itself Interchanges to
'get_interchanges',
# ▼ I can not see the Parts that reference itself as being an Interchange
'get_references']
管理员中的零件模型供参考...
这是我的资料:
这是我想要得到的:
作为确认,管理中的交换模型:
如何获得对称自引用 M2M django 模型的另一面?
如何 return Part
在交换 table 中但在参考(第一)列中
备注:
- 使用 Django 1.11
- 我知道根据 docs 通过模型使用 M2M 时需要
- This 不错的文章帮助我走得很远,但在管理员中,我似乎无法让
interchange_part
在管理员中显示其reference_part
页面(因此我什至没有尝试在具有 different/particular 功能的视图中查看是否可行) - 在 docs 中,它指出
through_keys
的元组的第二部分称为target
模型,但我找不到引用第一部分的内容 - 我确信有一种方法可以深入多个层次,即如果第一个部分交换为 2,并且 2 => 3,那么 1 应该列出 2 和 3(但这不是重点片刻)
- 请指正我的误解,谢谢:)
False
的对称性
如果 manytomany 具有通过 table 和 related_name
参数并且不包含 +
,那么您可以直接访问该集:
def get_references(self):
return ", ".join([str(p) for p in self.interchanges_to.all()])
请注意,我不确定 performance/complexity