Django + 查询集 + m2m + 外键
Django + Queryset + m2m + ForeignKey
我正在尝试获取具有唯一性 'source' 且所有用户都为其添加了 'terms' 的列表,例如
来自:
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 的字典:
{'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)
您可以通过以下方式获取数据:
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
个实例。从那里开始,您将获得每个 user
的 terms
并将它们添加到当前 source
.
的条款中
然后,您将 data
列表添加到正在处理的 source
的表示中。 list(set(terms))
删除了 terms
.
中可能的重复项
有关user_filter_set
的解释,请参阅official doc关于多对一关系。
我正在尝试获取具有唯一性 'source' 且所有用户都为其添加了 'terms' 的列表,例如
来自:
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 的字典:
{'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)
您可以通过以下方式获取数据:
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
个实例。从那里开始,您将获得每个 user
的 terms
并将它们添加到当前 source
.
然后,您将 data
列表添加到正在处理的 source
的表示中。 list(set(terms))
删除了 terms
.
有关user_filter_set
的解释,请参阅official doc关于多对一关系。