Набор запросов Django для соответствия всем связанным объектам

Допустим, у меня есть ForeignKey от кокоса до ласточки (то есть ласточка несла много кокосовых орехов, но каждый кокос был перенесен только одной ласточкой). Теперь предположим, что у меня есть ForeignKey от husk_segment до Coconut.

Теперь у меня есть список фрагментов husk_sex, и я хочу узнать, были ли ВСЕ из них перенесены определенной ласточкой.

У меня может быть файл swallow.objects.filter (coconuts_carried__husk_sements__in = husk_segment_list), чтобы показать, что эта ласточка захватила хотя бы один сегмент шелухи в списке. Теперь, как я могу показать, что каждый сегмент шелухи, который когда-либо носил ласточка, находится в этом списке?

4 голоса | спросил jMyles 22 J000000Friday11 2011, 02:48:16

3 ответа


0
  

У меня может быть swallow.objects.filter (coconuts_carried__husk_sements__in =   husk_segment_list), чтобы показать, что эта ласточка захватила хотя бы одну   сегмент шелухи в списке.

Нет, это неправильно, это дает вам список ласточек , в которых есть хотя бы один сегмент шелухи из * husk_segment_list *.

Если я правильно понял, мы говорим о проверке конкретной ласточки.

Итак, из вашего описания, я думаю, ваши модели выглядят примерно так:

class Swallow(models.Model):
    name = models.CharField(max_length=100)


class Coconut(models.Model):
    swallow = models.ForeignKey(Swallow, related_name='coconuts_carried')



class HuskSegment(models.Model):
    coconut = models.ForeignKey(Coconut, related_name='husk_segments')

Если у вас уже есть список сегментов шелухи, вам необходимо проверить еще раз сегменты ласточки, нет причин для его разрешения в запросе. Получите сегменты ласточек и проверьте, является ли это надмножеством вашего списка сегментов шелухи.

Итак, у нас есть:

#husk_segment_list = [<object: HuskSegment>, <object: HuskSegment>, <object: HuskSegment>...]
husk_segments_set = set((husk.pk for husk in husk_segment_list))

whitey = Swallow.object.get(name='Neochelidon tibialis')
wh_segments_set = set((value[0] for value in HuskSegment.objects.filter(coconut__in=whitey.coconuts_carried.all()).values_list('id')))

whitey_has_carried_all = wh_segments_set.issuperset(husk_segments_set)
ответил Botond Béres 22 J000000Friday11 2011, 16:29:20
0

Смотрите документы по запросам, охватывающим несколько отношения - вы должны фильтровать вызовы.

Простым способом было бы что-то вроде

queryset = Swallow.objects.all()
for coconut in coconuts:
    queryset = queryset.filter(coconuts_carried=coconut)

Причудливый способ сделать это в одну строку, используя reduce, будет

reduce(lambda q, c: q.filter(coconuts_carried=c), coconuts, Swallow.objects.all())
ответил Ismail Badawi 22 J000000Friday11 2011, 03:01:15
0

Если я правильно понял ваш измененный вопрос, вы сможете сравнить coconut_carried_set ласточки со списком перенесенных кокосовых орехов.

см. документы

Я не совсем уверен, что это то, что вы хотите - я думаю, это зависит от того, знаете ли вы, какую ласточку вы хотите проверить заранее или хотите ли вы проверить ее на предмет всех ласточек - в этом случае может быть лучше решение.

ответил niklasdstrom 22 J000000Friday11 2011, 03:29:33

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132