簡體   English   中英

django m2m關系真的有必要嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM