Django ORM быстрый запрос, чтобы объединить две модели и получить список парных кортежей - PullRequest
0 голосов
/ 27 июня 2018

Вот как выглядит мой models.py:

class Foo(models.Model):
    name = models.CharField(max_length=30)

class Bar(models.Model):
    name = models.CharField(max_length=30)

 class Hat(models.Model):
    foo = models.ForeignKey(Foo, on_delete=models.CASCADE)
    bar = models.ForeignKey(Bar, on_delete=models.CASCADE)
    num = models.PositiveIntegerField(default=0)

    class Meta:
        unique_together = ('foo', 'bar')

Теперь в моем views.py я хочу иметь функцию вроде:

def index(request):
    foo = request.foo
    bars = Bar.objects.all()
    hats = Hat.objects.filter(foo=foo).all()

    #return  ???

что я хочу получить в качестве выходных данных индексной функции, это список кортежей типа [(bar_1, hat_1),(bar_2, hat_2), ...], где для каждого hat_i у нас есть hat_i.bar == bar_i, и если нет объекта Hat, связанного с bar_i, я хочу, чтобы он был в паре с None.

Какой самый быстрый способ создать такой список в Django?

1 Ответ

0 голосов
/ 27 июня 2018

Попробуйте

foo = request.foo   
bars = Bar.objects.all()
hats = Hat.objects.filter(foo=foo).all()

# List which has bar and hat pairings
final_list = [(x.bar, x) for x in hats]

# if want pairing with None, then do this 
all_bars = set(bars)
included_bars = set([x.bar for x in hats])

no_hat_bars = all_bars - included_bars

for bar in no_hat_bars:
    final_list.append(bar, None)

наконец, final_list должен иметь требуемое содержимое.

...