mirror of
https://github.com/django/django.git
synced 2024-11-25 07:59:34 +01:00
83f5478225
While refs #34612 surfaced issues with reverse one-to-one fields deferrals, it missed that switching to storing remote fields would break self-referential relationships. This change switches to storing related objects in the select mask instead of remote fields to prevent collisions when dealing with self-referential relationships that might have a different directional mask. Despite fixing #21204 introduced a crash under some self-referential deferral conditions, it was simply not working even before that as it aggregated the sets of deferred fields by model. Thanks Joshua van Besouw for the report and Mariusz Felisiak for the review.
102 lines
2.5 KiB
Python
102 lines
2.5 KiB
Python
"""
|
|
Regression tests for defer() / only() behavior.
|
|
"""
|
|
|
|
from django.db import models
|
|
|
|
|
|
class Item(models.Model):
|
|
name = models.CharField(max_length=15)
|
|
text = models.TextField(default="xyzzy")
|
|
value = models.IntegerField()
|
|
other_value = models.IntegerField(default=0)
|
|
source = models.OneToOneField(
|
|
"self",
|
|
related_name="destination",
|
|
on_delete=models.CASCADE,
|
|
null=True,
|
|
)
|
|
|
|
|
|
class RelatedItem(models.Model):
|
|
item = models.ForeignKey(Item, models.CASCADE)
|
|
|
|
|
|
class ProxyRelated(RelatedItem):
|
|
class Meta:
|
|
proxy = True
|
|
|
|
|
|
class Child(models.Model):
|
|
name = models.CharField(max_length=10)
|
|
value = models.IntegerField()
|
|
|
|
|
|
class Leaf(models.Model):
|
|
name = models.CharField(max_length=10)
|
|
child = models.ForeignKey(Child, models.CASCADE)
|
|
second_child = models.ForeignKey(
|
|
Child, models.SET_NULL, related_name="other", null=True
|
|
)
|
|
value = models.IntegerField(default=42)
|
|
|
|
|
|
class ResolveThis(models.Model):
|
|
num = models.FloatField()
|
|
name = models.CharField(max_length=16)
|
|
|
|
|
|
class Proxy(Item):
|
|
class Meta:
|
|
proxy = True
|
|
|
|
|
|
class SimpleItem(models.Model):
|
|
name = models.CharField(max_length=15)
|
|
value = models.IntegerField()
|
|
|
|
|
|
class Feature(models.Model):
|
|
item = models.ForeignKey(SimpleItem, models.CASCADE)
|
|
|
|
|
|
class SpecialFeature(models.Model):
|
|
feature = models.ForeignKey(Feature, models.CASCADE)
|
|
|
|
|
|
class OneToOneItem(models.Model):
|
|
item = models.OneToOneField(Item, models.CASCADE, related_name="one_to_one_item")
|
|
name = models.CharField(max_length=15)
|
|
|
|
|
|
class ItemAndSimpleItem(models.Model):
|
|
item = models.ForeignKey(Item, models.CASCADE)
|
|
simple = models.ForeignKey(SimpleItem, models.CASCADE)
|
|
|
|
|
|
class Profile(models.Model):
|
|
profile1 = models.CharField(max_length=255, default="profile1")
|
|
|
|
|
|
class Location(models.Model):
|
|
location1 = models.CharField(max_length=255, default="location1")
|
|
|
|
|
|
class Request(models.Model):
|
|
profile = models.ForeignKey(Profile, models.SET_NULL, null=True, blank=True)
|
|
location = models.ForeignKey(Location, models.CASCADE)
|
|
items = models.ManyToManyField(Item)
|
|
|
|
request1 = models.CharField(default="request1", max_length=255)
|
|
request2 = models.CharField(default="request2", max_length=255)
|
|
request3 = models.CharField(default="request3", max_length=255)
|
|
request4 = models.CharField(default="request4", max_length=255)
|
|
|
|
|
|
class Base(models.Model):
|
|
text = models.TextField()
|
|
|
|
|
|
class Derived(Base):
|
|
other_text = models.TextField()
|