示例#1
0
 async def test_prefetch_m2m_to_attr(self):
     tournament = await Tournament.create(name="tournament")
     team = await Team.create(name="1")
     team_second = await Team.create(name="2")
     event = await Event.create(name="First", tournament=tournament)
     await event.participants.add(team, team_second)
     event = await Event.first().prefetch_related(
         Prefetch("participants", Team.filter(name="1"), to_attr="to_attr_participants_1"),
         Prefetch("participants", Team.filter(name="2"), to_attr="to_attr_participants_2"),
     )
     self.assertEqual(list(event.to_attr_participants_1), [team])
     self.assertEqual(list(event.to_attr_participants_2), [team_second])
示例#2
0
    async def test_filtering(self):
        tournament = Tournament(name="Tournament")
        await tournament.save()

        second_tournament = Tournament(name="Tournament 2")
        await second_tournament.save()

        event_first = Event(name="1", tournament=tournament)
        await event_first.save()
        event_second = Event(name="2", tournament=second_tournament)
        await event_second.save()
        event_third = Event(name="3", tournament=tournament)
        await event_third.save()
        event_forth = Event(name="4", tournament=second_tournament)
        await event_forth.save()

        team_first = Team(name="First")
        await team_first.save()
        team_second = Team(name="Second")
        await team_second.save()

        await team_first.events.add(event_first)
        await event_second.participants.add(team_second)

        found_events = (await Event.filter(
            Q(pk__in=[event_first.pk, event_second.pk])
            | Q(name="3")).filter(participants__not=team_second.id
                                  ).order_by("name",
                                             "tournament_id").distinct())
        self.assertEqual(len(found_events), 2)
        self.assertEqual(found_events[0].pk, event_first.pk)
        self.assertEqual(found_events[1].pk, event_third.pk)
        await Team.filter(events__tournament_id=tournament.id
                          ).order_by("-events__name")
        await Tournament.filter(events__name__in=["1", "3"]).distinct()

        teams = await Team.filter(name__icontains="CON")
        self.assertEqual(len(teams), 1)
        self.assertEqual(teams[0].name, "Second")

        teams = await Team.filter(name__iexact="SeCoNd")
        self.assertEqual(len(teams), 1)
        self.assertEqual(teams[0].name, "Second")

        tournaments = await Tournament.filter(
            events__participants__name__startswith="Fir")
        self.assertEqual(len(tournaments), 1)
        self.assertEqual(tournaments[0], tournament)
示例#3
0
    async def test_relations(self):
        tournament = Tournament(name="New Tournament")
        await tournament.save()
        await Event(name="Without participants",
                    tournament_id=tournament.id).save()
        event = Event(name="Test", tournament_id=tournament.id)
        await event.save()
        participants = []
        for i in range(2):
            team = Team(name=f"Team {(i + 1)}")
            await team.save()
            participants.append(team)
        await event.participants.add(participants[0], participants[1])
        await event.participants.add(participants[0], participants[1])

        with self.assertRaises(NoValuesFetched):
            [team.id for team in event.participants]  # pylint: disable=W0104

        teamids = []
        async for team in event.participants:
            teamids.append(team.id)
        self.assertEqual(set(teamids),
                         {participants[0].id, participants[1].id})
        teamids = [team.id async for team in event.participants]
        self.assertEqual(set(teamids),
                         {participants[0].id, participants[1].id})

        self.assertEqual({team.id
                          for team in event.participants},
                         {participants[0].id, participants[1].id})

        self.assertIn(event.participants[0].id,
                      {participants[0].id, participants[1].id})

        selected_events = await Event.filter(participants=participants[0].id
                                             ).prefetch_related(
                                                 "participants", "tournament")
        self.assertEqual(len(selected_events), 1)
        self.assertEqual(selected_events[0].tournament.id, tournament.id)
        self.assertEqual(len(selected_events[0].participants), 2)
        await participants[0].fetch_related("events")
        self.assertEqual(participants[0].events[0], event)

        await Team.fetch_for_list(participants, "events")

        await Team.filter(events__tournament__id=tournament.id)

        await Event.filter(tournament=tournament)

        await Tournament.filter(events__name__in=["Test", "Prod"]).distinct()

        result = await Event.filter(id=event.id
                                    ).values("id",
                                             "name",
                                             tournament="tournament__name")
        self.assertEqual(result[0]["tournament"], tournament.name)

        result = await Event.filter(id=event.id
                                    ).values_list("id", "participants__name")
        self.assertEqual(len(result), 2)
示例#4
0
 async def test_prefetch_m2m(self):
     tournament = await Tournament.create(name="tournament")
     event = await Event.create(name="First", tournament=tournament)
     team = await Team.create(name="1")
     team_second = await Team.create(name="2")
     await event.participants.add(team, team_second)
     fetched_events = (await Event.all().prefetch_related(
         Prefetch("participants", queryset=Team.filter(name="1"))).first())
     self.assertEqual(len(fetched_events.participants), 1)
示例#5
0
    async def test_aggregation(self):
        tournament = Tournament(name="New Tournament")
        await tournament.save()

        await Tournament.create(name="Second tournament")
        await Event(name="Without participants",
                    tournament_id=tournament.id).save()

        event = Event(name="Test", tournament_id=tournament.id)
        await event.save()

        await Team.bulk_create(
            Team(name="Team {}".format(i + 1)) for i in range(2))
        participants = list(await Team.all())

        await event.participants.add(participants[0], participants[1])
        await event.participants.add(participants[0], participants[1])

        ##############
        tournaments_with_count = (await Tournament.all().annotate(
            events_count=Count("events")).filter(events_count__gte=1))
        self.assertEqual(len(tournaments_with_count), 1)
        self.assertEqual(tournaments_with_count[0].events_count, 2)

        ##############
        event_with_lowest_team_id = (await Event.filter(id=event.id).annotate(
            lowest_team_id=Min("participants__id")).first())
        self.assertEqual(event_with_lowest_team_id.lowest_team_id,
                         participants[0].id)

        ##############
        ordered_tournaments = (await Tournament.all().annotate(
            events_count=Count("events")).order_by("events_count"))
        self.assertEqual(len(ordered_tournaments), 2)
        self.assertEqual(ordered_tournaments[1].id, tournament.id)

        ##############
        default_name_tournaments = (await Tournament.all().annotate(
            Count("events")).order_by("events__count"))
        self.assertEqual(len(default_name_tournaments), 2)
        self.assertEqual(default_name_tournaments[1].id, tournament.id)

        ##############
        event_with_annotation = (await Event.all().annotate(
            tournament_test_id=Sum("tournament__id")).first())
        self.assertEqual(event_with_annotation.tournament_test_id,
                         event_with_annotation.tournament_id)

        ##############
        with self.assertRaisesRegex(NotARelationFieldError,
                                    str(NotARelationFieldError("name",
                                                               Event))):
            await Event.all().annotate(tournament_test_id=Sum("name__id")
                                       ).first()
示例#6
0
    async def test_prefetch_m2m_filter(self):
        tournament = await Tournament.create(name="tournament")
        team = await Team.create(name="1")
        team_second = await Team.create(name="2")
        event = await Event.create(name="First", tournament=tournament)
        await event.participants.add(team, team_second)
        event = await Event.all().prefetch_related(
            Prefetch("participants", Team.filter(name="2"))).first()

        self.assertEqual(len(event.participants), 1)
        self.assertEqual(list(event.participants), [team_second])
    async def test_aggregation(self):
        tournament = Tournament(name="New Tournament")
        await tournament.save()
        await Tournament.create(name="Second tournament")
        await Event(name="Without participants", tournament_id=tournament.id).save()
        event = Event(name="Test", tournament_id=tournament.id)
        await event.save()
        participants = []
        for i in range(2):
            team = Team(name="Team {}".format(i + 1))
            await team.save()
            participants.append(team)
        await event.participants.add(participants[0], participants[1])
        await event.participants.add(participants[0], participants[1])

        tournaments_with_count = (
            await Tournament.all()
            .annotate(events_count=Count("events"))
            .filter(events_count__gte=1)
        )
        self.assertEqual(len(tournaments_with_count), 1)
        self.assertEqual(tournaments_with_count[0].events_count, 2)

        event_with_lowest_team_id = (
            await Event.filter(id=event.id).first().annotate(lowest_team_id=Min("participants__id"))
        )
        self.assertEqual(event_with_lowest_team_id.lowest_team_id, participants[0].id)

        ordered_tournaments = (
            await Tournament.all().annotate(events_count=Count("events")).order_by("events_count")
        )
        self.assertEqual(len(ordered_tournaments), 2)
        self.assertEqual(ordered_tournaments[1].id, tournament.id)
        event_with_annotation = (
            await Event.all().annotate(tournament_test_id=Sum("tournament__id")).first()
        )
        self.assertEqual(
            event_with_annotation.tournament_test_id, event_with_annotation.tournament_id
        )

        with self.assertRaisesRegex(ConfigurationError, "name__id not resolvable"):
            await Event.all().annotate(tournament_test_id=Sum("name__id")).first()
示例#8
0
 def test_rev_m2m(self):
     with self.assertRaisesRegex(
             ConfigurationError,
             "You can't set m2m relations through init, use m2m_manager instead"
     ):
         Team(name="a", events=[])