【问题标题】:Django + Queryset + m2m + ForeignKeyDjango + 查询集 + m2m + ForeignKey
【发布时间】:2016-10-13 00:33:56
【问题描述】:

我正在尝试获取具有唯一“来源”的列表,并且所有用户都为其添加了“条款”,例如

来自:

user1 s1 [t3,t4,t5]
user1 s2 [t1,t2]
user2 s1 [t1,t2]
user2 s2 [t3,t4,t5]

到:

s1 t1,t2,t3,t4,t5
s2 t1,t2,t3,t4,t5

我的模型:

class User_Filter(models.Model):
    user = models.ForeignKey(User)
    source = models.ForeignKey(Source, null=True)
    terms = models.ManyToManyField(Term)

class Source(models.Model):
    title = models.CharField('name', max_length=100, blank=True)
    url = models.URLField('url', unique=True)

class Term(models.Model):
    title = models.CharField('title', max_length=100, unique=True)

我正在玩这个代码:

sources = User_Filter.objects.values('source').distinct()

这一行吐出带有源 ID 的 dict:

{'source': 1}
{'source': 2}

从这一点开始,我被困住了。非常感谢任何帮助。

丑陋的解决方案:

list = []
for s in User_Filter.objects.values('source').distinct():
    objs = User_Filter.objects.all().filter(source=s['source'])
    source = Source.objects.get(id=s['source']).url
    source_dict = {}
    terms = []
    for obj in objs:
        for term in obj.terms.all():
            if term.title not in terms: terms.append(term.title)
    source_dict['terms']=terms
    source_dict['url']=source
    to_scraper.append(source_dict)
print (list)

【问题讨论】:

  • 您也应该在此处包含 TermSource 模型
  • 添加了其他模型

标签: django django-queryset


【解决方案1】:

您可以通过以下方式获取数据:

data = []

for source in Source.objects.all():
    terms = []

    for user in source.user_filter_set.all():
        terms.extend(user.terms.all().values_list('title', flat=True))

    data.append({'url': source.url, 'terms': list(set(terms))})

您遍历每个 Source 并获取其相关的 User_Filter 实例。从那里开始,您将获得每个userterms,并将它们添加到当前source 的条款中。

然后,您将正在处理的source 的表示添加到data 列表。 list(set(terms)) 消除了terms 中可能存在的重复项。


有关user_filter_set的解释,请参阅official doc关于多对一关系。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    • 2015-03-17
    相关资源
    最近更新 更多