1. from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
    
  2. from django.contrib.contenttypes.models import ContentType
    
  3. from django.db import models
    
  4. 
    
  5. 
    
  6. class P(models.Model):
    
  7.     pass
    
  8. 
    
  9. 
    
  10. class R(models.Model):
    
  11.     is_default = models.BooleanField(default=False)
    
  12.     p = models.ForeignKey(P, models.CASCADE, null=True)
    
  13. 
    
  14. 
    
  15. def get_default_r():
    
  16.     return R.objects.get_or_create(is_default=True)[0].pk
    
  17. 
    
  18. 
    
  19. class S(models.Model):
    
  20.     r = models.ForeignKey(R, models.CASCADE)
    
  21. 
    
  22. 
    
  23. class T(models.Model):
    
  24.     s = models.ForeignKey(S, models.CASCADE)
    
  25. 
    
  26. 
    
  27. class U(models.Model):
    
  28.     t = models.ForeignKey(T, models.CASCADE)
    
  29. 
    
  30. 
    
  31. class RChild(R):
    
  32.     pass
    
  33. 
    
  34. 
    
  35. class RChildChild(RChild):
    
  36.     pass
    
  37. 
    
  38. 
    
  39. class A(models.Model):
    
  40.     name = models.CharField(max_length=30)
    
  41. 
    
  42.     auto = models.ForeignKey(R, models.CASCADE, related_name="auto_set")
    
  43.     auto_nullable = models.ForeignKey(
    
  44.         R, models.CASCADE, null=True, related_name="auto_nullable_set"
    
  45.     )
    
  46.     setvalue = models.ForeignKey(R, models.SET(get_default_r), related_name="setvalue")
    
  47.     setnull = models.ForeignKey(
    
  48.         R, models.SET_NULL, null=True, related_name="setnull_set"
    
  49.     )
    
  50.     setdefault = models.ForeignKey(
    
  51.         R, models.SET_DEFAULT, default=get_default_r, related_name="setdefault_set"
    
  52.     )
    
  53.     setdefault_none = models.ForeignKey(
    
  54.         R,
    
  55.         models.SET_DEFAULT,
    
  56.         default=None,
    
  57.         null=True,
    
  58.         related_name="setnull_nullable_set",
    
  59.     )
    
  60.     cascade = models.ForeignKey(R, models.CASCADE, related_name="cascade_set")
    
  61.     cascade_nullable = models.ForeignKey(
    
  62.         R, models.CASCADE, null=True, related_name="cascade_nullable_set"
    
  63.     )
    
  64.     protect = models.ForeignKey(
    
  65.         R, models.PROTECT, null=True, related_name="protect_set"
    
  66.     )
    
  67.     restrict = models.ForeignKey(
    
  68.         R, models.RESTRICT, null=True, related_name="restrict_set"
    
  69.     )
    
  70.     donothing = models.ForeignKey(
    
  71.         R, models.DO_NOTHING, null=True, related_name="donothing_set"
    
  72.     )
    
  73.     child = models.ForeignKey(RChild, models.CASCADE, related_name="child")
    
  74.     child_setnull = models.ForeignKey(
    
  75.         RChild, models.SET_NULL, null=True, related_name="child_setnull"
    
  76.     )
    
  77.     cascade_p = models.ForeignKey(
    
  78.         P, models.CASCADE, related_name="cascade_p_set", null=True
    
  79.     )
    
  80. 
    
  81.     # A OneToOneField is just a ForeignKey unique=True, so we don't duplicate
    
  82.     # all the tests; just one smoke test to ensure on_delete works for it as
    
  83.     # well.
    
  84.     o2o_setnull = models.ForeignKey(
    
  85.         R, models.SET_NULL, null=True, related_name="o2o_nullable_set"
    
  86.     )
    
  87. 
    
  88. 
    
  89. class B(models.Model):
    
  90.     protect = models.ForeignKey(R, models.PROTECT)
    
  91. 
    
  92. 
    
  93. def create_a(name):
    
  94.     a = A(name=name)
    
  95.     for name in (
    
  96.         "auto",
    
  97.         "auto_nullable",
    
  98.         "setvalue",
    
  99.         "setnull",
    
  100.         "setdefault",
    
  101.         "setdefault_none",
    
  102.         "cascade",
    
  103.         "cascade_nullable",
    
  104.         "protect",
    
  105.         "restrict",
    
  106.         "donothing",
    
  107.         "o2o_setnull",
    
  108.     ):
    
  109.         r = R.objects.create()
    
  110.         setattr(a, name, r)
    
  111.     a.child = RChild.objects.create()
    
  112.     a.child_setnull = RChild.objects.create()
    
  113.     a.save()
    
  114.     return a
    
  115. 
    
  116. 
    
  117. class M(models.Model):
    
  118.     m2m = models.ManyToManyField(R, related_name="m_set")
    
  119.     m2m_through = models.ManyToManyField(R, through="MR", related_name="m_through_set")
    
  120.     m2m_through_null = models.ManyToManyField(
    
  121.         R, through="MRNull", related_name="m_through_null_set"
    
  122.     )
    
  123. 
    
  124. 
    
  125. class MR(models.Model):
    
  126.     m = models.ForeignKey(M, models.CASCADE)
    
  127.     r = models.ForeignKey(R, models.CASCADE)
    
  128. 
    
  129. 
    
  130. class MRNull(models.Model):
    
  131.     m = models.ForeignKey(M, models.CASCADE)
    
  132.     r = models.ForeignKey(R, models.SET_NULL, null=True)
    
  133. 
    
  134. 
    
  135. class Avatar(models.Model):
    
  136.     desc = models.TextField(null=True)
    
  137. 
    
  138. 
    
  139. # This model is used to test a duplicate query regression (#25685)
    
  140. class AvatarProxy(Avatar):
    
  141.     class Meta:
    
  142.         proxy = True
    
  143. 
    
  144. 
    
  145. class User(models.Model):
    
  146.     avatar = models.ForeignKey(Avatar, models.CASCADE, null=True)
    
  147. 
    
  148. 
    
  149. class HiddenUser(models.Model):
    
  150.     r = models.ForeignKey(R, models.CASCADE, related_name="+")
    
  151. 
    
  152. 
    
  153. class HiddenUserProfile(models.Model):
    
  154.     user = models.ForeignKey(HiddenUser, models.CASCADE)
    
  155. 
    
  156. 
    
  157. class M2MTo(models.Model):
    
  158.     pass
    
  159. 
    
  160. 
    
  161. class M2MFrom(models.Model):
    
  162.     m2m = models.ManyToManyField(M2MTo)
    
  163. 
    
  164. 
    
  165. class Parent(models.Model):
    
  166.     pass
    
  167. 
    
  168. 
    
  169. class Child(Parent):
    
  170.     pass
    
  171. 
    
  172. 
    
  173. class Base(models.Model):
    
  174.     pass
    
  175. 
    
  176. 
    
  177. class RelToBase(models.Model):
    
  178.     base = models.ForeignKey(Base, models.DO_NOTHING, related_name="rels")
    
  179. 
    
  180. 
    
  181. class Origin(models.Model):
    
  182.     pass
    
  183. 
    
  184. 
    
  185. class Referrer(models.Model):
    
  186.     origin = models.ForeignKey(Origin, models.CASCADE)
    
  187.     unique_field = models.IntegerField(unique=True)
    
  188.     large_field = models.TextField()
    
  189. 
    
  190. 
    
  191. class SecondReferrer(models.Model):
    
  192.     referrer = models.ForeignKey(Referrer, models.CASCADE)
    
  193.     other_referrer = models.ForeignKey(
    
  194.         Referrer, models.CASCADE, to_field="unique_field", related_name="+"
    
  195.     )
    
  196. 
    
  197. 
    
  198. class DeleteTop(models.Model):
    
  199.     b1 = GenericRelation("GenericB1")
    
  200.     b2 = GenericRelation("GenericB2")
    
  201. 
    
  202. 
    
  203. class B1(models.Model):
    
  204.     delete_top = models.ForeignKey(DeleteTop, models.CASCADE)
    
  205. 
    
  206. 
    
  207. class B2(models.Model):
    
  208.     delete_top = models.ForeignKey(DeleteTop, models.CASCADE)
    
  209. 
    
  210. 
    
  211. class B3(models.Model):
    
  212.     restrict = models.ForeignKey(R, models.RESTRICT)
    
  213. 
    
  214. 
    
  215. class DeleteBottom(models.Model):
    
  216.     b1 = models.ForeignKey(B1, models.RESTRICT)
    
  217.     b2 = models.ForeignKey(B2, models.CASCADE)
    
  218. 
    
  219. 
    
  220. class GenericB1(models.Model):
    
  221.     content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    
  222.     object_id = models.PositiveIntegerField()
    
  223.     generic_delete_top = GenericForeignKey("content_type", "object_id")
    
  224. 
    
  225. 
    
  226. class GenericB2(models.Model):
    
  227.     content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    
  228.     object_id = models.PositiveIntegerField()
    
  229.     generic_delete_top = GenericForeignKey("content_type", "object_id")
    
  230.     generic_delete_bottom = GenericRelation("GenericDeleteBottom")
    
  231. 
    
  232. 
    
  233. class GenericDeleteBottom(models.Model):
    
  234.     generic_b1 = models.ForeignKey(GenericB1, models.RESTRICT)
    
  235.     content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    
  236.     object_id = models.PositiveIntegerField()
    
  237.     generic_b2 = GenericForeignKey()
    
  238. 
    
  239. 
    
  240. class GenericDeleteBottomParent(models.Model):
    
  241.     generic_delete_bottom = models.ForeignKey(
    
  242.         GenericDeleteBottom, on_delete=models.CASCADE
    
  243.     )