|
2 | 2 | import re |
3 | 3 | import uuid |
4 | 4 |
|
| 5 | +from django.contrib.auth import get_user_model |
5 | 6 | from django.contrib.contenttypes.models import ContentType |
6 | 7 | from django.db import models, connection |
7 | 8 | from django.db.models import Case, Count, FilteredRelation, Q, Sum, When, Exists, OuterRef |
|
94 | 95 | UUIDResearchProject, |
95 | 96 | Duck, |
96 | 97 | PurpleHeadDuck, |
| 98 | + Account, |
| 99 | + SpecialAccount1, |
| 100 | + SpecialAccount1_1, |
| 101 | + SpecialAccount2, |
97 | 102 | ) |
98 | 103 |
|
99 | 104 |
|
@@ -1521,3 +1526,94 @@ def test_subqueries(self): |
1521 | 1526 | InlineParent.objects.all().delete() |
1522 | 1527 | InlineModelA.objects.all().delete() |
1523 | 1528 | InlineModelB.objects.all().delete() |
| 1529 | + |
| 1530 | + def test_one_to_one_primary_key(self): |
| 1531 | + # check pk name resolution |
| 1532 | + for mdl in [Account, SpecialAccount1, SpecialAccount1_1, SpecialAccount2]: |
| 1533 | + assert mdl.polymorphic_primary_key_name == mdl._meta.pk.name |
| 1534 | + |
| 1535 | + user1 = get_user_model().objects.create( |
| 1536 | + username="user1", email="[email protected]", password="password" |
| 1537 | + ) |
| 1538 | + user2 = get_user_model().objects.create( |
| 1539 | + username="user2", email="[email protected]", password="password" |
| 1540 | + ) |
| 1541 | + user3 = get_user_model().objects.create( |
| 1542 | + username="user3", email="[email protected]", password="password" |
| 1543 | + ) |
| 1544 | + user4 = get_user_model().objects.create( |
| 1545 | + username="user4", email="[email protected]", password="password" |
| 1546 | + ) |
| 1547 | + |
| 1548 | + user1_profile = SpecialAccount1_1.objects.create(user=user1, extra1=5, extra2=6) |
| 1549 | + |
| 1550 | + user2_profile = SpecialAccount1.objects.create(user=user2, extra1=5) |
| 1551 | + |
| 1552 | + user3_profile = SpecialAccount2.objects.create(user=user3, extra1="test") |
| 1553 | + |
| 1554 | + user4_profile = SpecialAccount1_1.objects.create(user=user4, extra1=7, extra2=8) |
| 1555 | + |
| 1556 | + user1.refresh_from_db() |
| 1557 | + assert user1.account.__class__ is SpecialAccount1_1 |
| 1558 | + assert user1.account.extra1 == 5 |
| 1559 | + assert user1.account.extra2 == 6 |
| 1560 | + assert user1_profile.pk == user1.account.pk |
| 1561 | + |
| 1562 | + user2.refresh_from_db() |
| 1563 | + assert user2.account.__class__ is SpecialAccount1 |
| 1564 | + assert user2.account.extra1 == 5 |
| 1565 | + assert user2_profile.pk == user2.account.pk |
| 1566 | + assert not hasattr(user2.account, "extra2") |
| 1567 | + |
| 1568 | + user3.refresh_from_db() |
| 1569 | + assert user3.account.__class__ is SpecialAccount2 |
| 1570 | + assert user3.account.extra1 == "test" |
| 1571 | + assert user3_profile.pk == user3.account.pk |
| 1572 | + assert not hasattr(user3.account, "extra2") |
| 1573 | + |
| 1574 | + user4.refresh_from_db() |
| 1575 | + assert user4.account.__class__ is SpecialAccount1_1 |
| 1576 | + assert user4.account.extra1 == 7 |
| 1577 | + assert user4.account.extra2 == 8 |
| 1578 | + assert user4_profile.pk == user4.account.pk |
| 1579 | + |
| 1580 | + assert get_user_model().objects.filter(pk=user2.pk).delete() == ( |
| 1581 | + 3, |
| 1582 | + {"tests.SpecialAccount1": 1, "tests.Account": 1, "auth.User": 1}, |
| 1583 | + ) |
| 1584 | + |
| 1585 | + assert SpecialAccount1.objects.count() == 2 |
| 1586 | + assert Account.objects.count() == 3 |
| 1587 | + |
| 1588 | + remaining = get_user_model().objects.filter( |
| 1589 | + pk__in=[user1.pk, user2.pk, user3.pk, user4.pk] |
| 1590 | + ) |
| 1591 | + assert remaining.count() == 3 |
| 1592 | + for usr, expected in zip( |
| 1593 | + remaining.order_by("pk"), (user1_profile, user3_profile, user4_profile) |
| 1594 | + ): |
| 1595 | + assert usr.account == expected |
| 1596 | + |
| 1597 | + assert get_user_model().objects.filter(pk__in=[user3.pk]).delete() == ( |
| 1598 | + 3, |
| 1599 | + {"tests.SpecialAccount2": 1, "tests.Account": 1, "auth.User": 1}, |
| 1600 | + ) |
| 1601 | + |
| 1602 | + assert Account.objects.count() == 2 |
| 1603 | + |
| 1604 | + assert SpecialAccount1_1.objects.all().delete() == ( |
| 1605 | + 6, |
| 1606 | + {"tests.SpecialAccount1_1": 2, "tests.SpecialAccount1": 2, "tests.Account": 2}, |
| 1607 | + ) |
| 1608 | + |
| 1609 | + assert Account.objects.count() == 0 |
| 1610 | + |
| 1611 | + remaining = get_user_model().objects.filter(pk__gte=user1.pk) |
| 1612 | + assert remaining.count() == 2 |
| 1613 | + for usr in remaining: |
| 1614 | + assert not hasattr(usr, "account") |
| 1615 | + |
| 1616 | + assert get_user_model().objects.filter(pk__in=[user1.pk, user4.pk]).delete() == ( |
| 1617 | + 2, |
| 1618 | + {"auth.User": 2}, |
| 1619 | + ) |
0 commit comments