[英]django is m2m relationship really necessary?
所以我有兩個這樣的模型。
class Channel(BaseModel):
class Meta:
verbose_name = 'channel'
verbose_name_plural = 'channels'
indexes = [
models.Index(fields=['box', 'name'], name='channel_box_name_idx'),
]
def __str__(self):
return self.name
def get_next_position(self):
aggregate = self.box.channels.aggregate(models.Max('position'))
return (aggregate['position__max'] or -1) + 1
def save(self, *args, **kwargs):
if self._state.adding:
# we insert the object's position if
# it hasn't been created yet. We need to do
# this explicitly because django doesn't
# allow more than one auto-field
self.position = self.get_next_position()
super(Channel, self).save(*args, **kwargs)
return self.box.channels.add(self)
super(Channel, self).save(*args, **kwargs)
objects = models.Manager()
name = models.CharField(max_length=100, validators=[MinLengthValidator(2)])
box = models.ForeignKey('api_backend.Box', on_delete=models.CASCADE)
position = models.PositiveSmallIntegerField(db_index=True)
REQUIRED_FIELDS = [name, box]
class Box(BaseModel):
class Meta:
verbose_name = 'box'
verbose_name_plural = 'boxes'
indexes = [
models.Index(fields=['owner'], name='box_owner_idx'),
models.Index(fields=['owner', 'name'], name='box_name_owner_idx'),
]
def __str__(self):
return self.name
objects = models.Manager()
icon = models.ImageField(upload_to='icons/', storage=DefaultStorage)
name = models.CharField(max_length=100, validators=[MinLengthValidator(2)])
owner = models.ForeignKey('api_backend.User', on_delete=models.CASCADE)
channels = models.ManyToManyField('api_backend.Channel', related_name='box_channels')
REQUIRED_FIELDS = [name, owner]
頻道有一個屬性box
。 並且box有一個m2m字段channels
。 所以在這種類型的關系中,每當我用盒子創建通道時,我都需要將它添加到盒子的 m2m 字段channels
。 這樣的事情真的有必要嗎? 就像我需要為 m2m 字段channels
提供一個額外的表,即使我沒有它,我也可以通過box.channel_set
訪問它
那么,性能會有什么變化嗎? 我應該改變我的模型結構嗎? 有人可以幫幫我嗎?
一個頻道可以有多個盒子嗎? 如果是,那么ManyToManyField
是合適的,並且應刪除ForeignKey
如果由於Channel
只能有一個相關的Box
而不需要ManyToManyField
,則應刪除ManyToManyField
並使用相關的訪問器channel_set
如果您希望在Box
實例上擁有一個名為channels
的屬性而不是channel_set
可用於訪問任何相關Channel
的屬性,您可以將related_name
提供給ForeignKey
class Channel(BaseModel):
...
box = models.ForeignKey('api_backend.Box', on_delete=models.CASCADE, related_name='channels')
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.