1from __future__ import absolute_import 2 3from django.db import models 4from django.utils.translation import ugettext_lazy as _ 5 6CHOICES = ((1, "this"), (2, _("that"))) 7 8 9class Person(models.Model): 10 name = models.CharField(max_length=30) 11 12 13class Pet(models.Model): 14 name = models.CharField(max_length=30) 15 age = models.PositiveIntegerField() 16 17 18class FilmDetails(models.Model): 19 location = models.CharField(max_length=30) 20 film = models.OneToOneField( 21 "Film", on_delete=models.CASCADE, related_name="details" 22 ) 23 24 25class Film(models.Model): 26 genre = models.CharField( 27 max_length=2, 28 help_text="Genre", 29 choices=[("do", "Documentary"), ("ot", "Other")], 30 default="ot", 31 ) 32 reporters = models.ManyToManyField("Reporter", related_name="films") 33 34 35class DoeReporterManager(models.Manager): 36 def get_queryset(self): 37 return super(DoeReporterManager, self).get_queryset().filter(last_name="Doe") 38 39 40class Reporter(models.Model): 41 first_name = models.CharField(max_length=30) 42 last_name = models.CharField(max_length=30) 43 email = models.EmailField() 44 pets = models.ManyToManyField("self") 45 a_choice = models.CharField(max_length=30, choices=CHOICES, blank=True) 46 objects = models.Manager() 47 doe_objects = DoeReporterManager() 48 49 reporter_type = models.IntegerField( 50 "Reporter Type", 51 null=True, 52 blank=True, 53 choices=[(1, u"Regular"), (2, u"CNN Reporter")], 54 ) 55 56 def __str__(self): # __unicode__ on Python 2 57 return "%s %s" % (self.first_name, self.last_name) 58 59 def __init__(self, *args, **kwargs): 60 """ 61 Override the init method so that during runtime, Django 62 can know that this object can be a CNNReporter by casting 63 it to the proxy model. Otherwise, as far as Django knows, 64 when a CNNReporter is pulled from the database, it is still 65 of type Reporter. This was added to test proxy model support. 66 """ 67 super(Reporter, self).__init__(*args, **kwargs) 68 if self.reporter_type == 2: # quick and dirty way without enums 69 self.__class__ = CNNReporter 70 71 def some_method(self): 72 return 123 73 74 75class CNNReporterManager(models.Manager): 76 def get_queryset(self): 77 return super(CNNReporterManager, self).get_queryset().filter(reporter_type=2) 78 79 80class CNNReporter(Reporter): 81 """ 82 This class is a proxy model for Reporter, used for testing 83 proxy model support 84 """ 85 86 class Meta: 87 proxy = True 88 89 objects = CNNReporterManager() 90 91 92class Article(models.Model): 93 headline = models.CharField(max_length=100) 94 pub_date = models.DateField() 95 pub_date_time = models.DateTimeField() 96 reporter = models.ForeignKey( 97 Reporter, on_delete=models.CASCADE, related_name="articles" 98 ) 99 editor = models.ForeignKey( 100 Reporter, on_delete=models.CASCADE, related_name="edited_articles_+" 101 ) 102 lang = models.CharField( 103 max_length=2, 104 help_text="Language", 105 choices=[("es", "Spanish"), ("en", "English")], 106 default="es", 107 ) 108 importance = models.IntegerField( 109 "Importance", 110 null=True, 111 blank=True, 112 choices=[(1, u"Very important"), (2, u"Not as important")], 113 ) 114 115 def __str__(self): # __unicode__ on Python 2 116 return self.headline 117 118 class Meta: 119 ordering = ("headline",) 120