在python3 manager.py inspectdb
(mysql) 和查看一些帮助和教程之后,我仍然有一些错误和不正确的结果。
class A(models.Model):
ida = models.AutoField(db_column='idA', primary_key=True)
col1 = #an another column
has_B = models.ManyToManyField(B, related_name='a', through="AHasB", through_fields=('a_ida', 'b_idb'))
#I had add this line after a tuto in django book for the manytomayfield
class B(models.Model):
idb = models.AutoField(db_column='idB', primary_key=True)
col1 = #an another column
class AHasB(models.Model):
a_ida = models.ForeignKey(A)
b_idb = models.ForeignKey(B)
col1 = #an another column
def myview(request):
for element in b.filter(idb__in=a.values('has_B').distinct()):
print(element)
在我的数据库中,我有
A :
ida | col1
1 | ...
2 | ...
3 | ...
B :
idb | col1
1 | ...
AHasB :
a_ida | b_idb
1 | 1
但是当我ida -> idb
像经典(SELECT idb,ida FROM A, B, AHasB WHERE AHasB.a_ida=A.ida AND AHasB.b_idb=B.idb
)一样显示结果()时,我有这个......
1 -> 1
2 -> 1
3 -> 1
在正常情况下,我只会有 1 -> 1。
也许模型不适合我后面的真实数据库。
def myview(request):
a = A.objects.All()
b = B.objects.All()
for element_a in a.filter("somefilters"):
in_has_b = set(AHasB.objects.values_list('b_idb', flat=True));
print(b.filter(idb__in=in_has_b))
如果要选择每个 A 实例引用/拥有的所有 B 实例:
bs_for_each_a = {}
for a in A.objects.all():
bs = AHasB.objects.filter(a_ida=a).values('b_idb')
bs_for_each_a[a] = bs
如果您需要不同的 B,您可以尝试添加.distinct()
aftervalues('b_idb')
但我没有测试它。删除重复项的另一种方法是使用values_list('b_idb', flat=True)
并传递查询结果set()
:
for a in A.objects.all():
bs = AHasB.objects.filter(a_ida=a).values_list('b_idb', flat=True)
bs_for_each_a[a] = set(bs)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句