Django:获取多对多关系中的相关对象

0 投票
1 回答
25 浏览
提问于 2025-04-14 17:23

我写这篇文章是想请教大家关于我的Django项目的一些问题。我创建了一个数据库,里面有主类别和子类别的数据,但我在获取相关记录时遇到了困难。特别是,我想找到主类别ID和子类别ID之间的关系。

class Categories(models.Model):
    cat_id = models.AutoField(primary_key=True)
    cat_name = models.CharField(max_length=200, help_text='Добавь новую категорию')

    def __str__(self):
        return f'{self.cat_name}'


class Subcategories(models.Model):
    sub_id = models.AutoField(primary_key=True)
    sub_cat = models.ForeignKey(Categories, on_delete=models.CASCADE,)
    sub_name = models.CharField(max_length=200, help_text='Добавь новую подкатегорию')

    def __str__(self):
        return f'{self.sub_cat} {self.sub_name}'


class Masters(models.Model):
    master_id = models.AutoField(primary_key=True)
    sub_master = models.ManyToManyField(Subcategories)
    name = models.CharField(max_length=200, help_text='Имя')
    info = models.CharField(max_length=500, help_text='Дополнительная информация', default=None, null=True, blank=True)
    phone = models.CharField(max_length=10, help_text='Контактный номер телефона', default=None, null=True, blank=True)
    address = models.CharField(max_length=500, help_text='Адрес, при наличии', default=None, null=True, blank=True)
    tg = models.CharField(max_length=20, help_text='Ник или ссылка на telegram', default=None, null=True, blank=True)
    wa = models.CharField(max_length=20, help_text='Ник или ссылка на whatsapp', default=None, null=True, blank=True)
    ig = models.CharField(max_length=20, help_text='Ник или ссылка на instagram', default=None, null=True, blank=True)
    vk = models.CharField(max_length=20, help_text='Ник или ссылка на vk', default=None, null=True, blank=True)
    password = models.CharField(max_length=20, editable=False, unique=True)
    visability = models.BooleanField(default=False)

    def __str__(self):
        return f'{self.master_id}, {self.sub_master}, {self.name}, {self.phone}, {self.address}, {self.tg}, ' \
               f'{self.wa}, {self.ig}, {self.visability}, {self.password},({", ".join(subcategories.sub_name for subcategories in self.sub_master.all())})'

我尝试了很多方法,包括阅读文档和在论坛上寻找答案,但都没有帮助我。以下是我考虑过的一些选项:

  • Masters.subcategories_set.through.objects.filter(master_id=12)

出现了错误:AttributeError: type object 'Masters' has no attribute 'subcategories_set'

  • AttributeError: type object 'Masters' has no attribute 'subcategories'

出现了错误:AttributeError: type object 'Masters' has no attribute 'subcategories'

master = Masters.objects.get(master_id=12)
        objects = master.sub_master.all()

<QuerySet [<Subcategories: Test2 test2>]> 这个选项只是返回了子类别和主类别对象的名称,但我需要的是主类别和子类别关系中的关联ID。

我感觉我可能漏掉了什么明显的东西,但就是想不起来是什么。

1 个回答

0
master = Masters.objects.get(master_id=pk)
s_m = master.sub_master.all()
connected_subs = []
for sub in s_m:
    connected_subs.append(sub.sub_id)

我找到了答案

撰写回答