在 django admin 中任意设置 ManyToMany 字段的 position/order?
Arbitrarily set position/order of ManyToMany field in django admin?
我有以下型号:
# Child
class Media (models.Model):
id = models.BigAutoField(primary_key=True)
name = models.CharField(max_length=128,unique=True)
file = models.FileField()
enabled = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
# Parent
class Gallery(models.Model):
id = models.BigAutoField(primary_key=True)
name = models.CharField(max_length=128,unique=True)
description = models.TextField(max_length=254,null=True)
medias = models.ManyToManyField(Media,related_name='medias')
enabled = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
verbose_name = "gallery"
verbose_name_plural = "galleries"
def __str__(self):
return self.name
我希望能够通过将 child table 设置在交叉点 table 中来对它进行排序;因此不影响 child table。我正在考虑在连接 table 中设置位置字段,手动将其添加到数据库中是唯一的方法吗?我是 Django 的新手,如果这只是一个基本问题,我提前道歉。
通常的 ManyToMany
在这里不起作用,因为关联 table 应该包含顺序。因此,在这种情况下,您必须将 through
加入组合:
class Gallery(models.Model):
medias = models.ManyToManyField('Media',related_name='medias', through='ChildGallery')
其中 ChildGallery
是连接模型:
class ChildGallery(models.Model):
child = models.ForeignKey(Child)
gallery = models.ForeignKey(Gallery)
order = models.IntegerField()
class Meta:
ordering = ['order']
我不知道你想如何实现顺序,但如果它只是一个数字,你可以使用我上面显示的 IntegerField
。
P.S。请注意,我将所有关联模型都用引号引起来(例如 'Child'
而不是 Child
)。它允许打破循环依赖,所以我推荐使用这种方式
我有以下型号:
# Child
class Media (models.Model):
id = models.BigAutoField(primary_key=True)
name = models.CharField(max_length=128,unique=True)
file = models.FileField()
enabled = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
# Parent
class Gallery(models.Model):
id = models.BigAutoField(primary_key=True)
name = models.CharField(max_length=128,unique=True)
description = models.TextField(max_length=254,null=True)
medias = models.ManyToManyField(Media,related_name='medias')
enabled = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
verbose_name = "gallery"
verbose_name_plural = "galleries"
def __str__(self):
return self.name
我希望能够通过将 child table 设置在交叉点 table 中来对它进行排序;因此不影响 child table。我正在考虑在连接 table 中设置位置字段,手动将其添加到数据库中是唯一的方法吗?我是 Django 的新手,如果这只是一个基本问题,我提前道歉。
通常的 ManyToMany
在这里不起作用,因为关联 table 应该包含顺序。因此,在这种情况下,您必须将 through
加入组合:
class Gallery(models.Model):
medias = models.ManyToManyField('Media',related_name='medias', through='ChildGallery')
其中 ChildGallery
是连接模型:
class ChildGallery(models.Model):
child = models.ForeignKey(Child)
gallery = models.ForeignKey(Gallery)
order = models.IntegerField()
class Meta:
ordering = ['order']
我不知道你想如何实现顺序,但如果它只是一个数字,你可以使用我上面显示的 IntegerField
。
P.S。请注意,我将所有关联模型都用引号引起来(例如 'Child'
而不是 Child
)。它允许打破循环依赖,所以我推荐使用这种方式