123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248 |
- from __future__ import unicode_literals
- import datetime
- from django.db import models
- from django.utils.encoding import python_2_unicode_compatible
- @python_2_unicode_compatible
- class Place(models.Model):
- name = models.CharField(max_length=50)
- address = models.CharField(max_length=80)
- class Meta:
- ordering = ('name',)
- def __str__(self):
- return "%s the place" % self.name
- @python_2_unicode_compatible
- class Restaurant(Place):
- serves_hot_dogs = models.BooleanField(default=False)
- serves_pizza = models.BooleanField(default=False)
- def __str__(self):
- return "%s the restaurant" % self.name
- @python_2_unicode_compatible
- class ItalianRestaurant(Restaurant):
- serves_gnocchi = models.BooleanField(default=False)
- def __str__(self):
- return "%s the italian restaurant" % self.name
- @python_2_unicode_compatible
- class ParkingLot(Place):
- # An explicit link to the parent (we can control the attribute name).
- parent = models.OneToOneField(Place, models.CASCADE, primary_key=True, parent_link=True)
- capacity = models.IntegerField()
- def __str__(self):
- return "%s the parking lot" % self.name
- class ParkingLot3(Place):
- # The parent_link connector need not be the pk on the model.
- primary_key = models.AutoField(primary_key=True)
- parent = models.OneToOneField(Place, models.CASCADE, parent_link=True)
- class ParkingLot4(models.Model):
- # Test parent_link connector can be discovered in abstract classes.
- parent = models.OneToOneField(Place, models.CASCADE, parent_link=True)
- class Meta:
- abstract = True
- class ParkingLot4A(ParkingLot4, Place):
- pass
- class ParkingLot4B(Place, ParkingLot4):
- pass
- @python_2_unicode_compatible
- class Supplier(models.Model):
- name = models.CharField(max_length=50)
- restaurant = models.ForeignKey(Restaurant, models.CASCADE)
- def __str__(self):
- return self.name
- class Wholesaler(Supplier):
- retailer = models.ForeignKey(Supplier, models.CASCADE, related_name='wholesale_supplier')
- class Parent(models.Model):
- created = models.DateTimeField(default=datetime.datetime.now)
- class Child(Parent):
- name = models.CharField(max_length=10)
- class SelfRefParent(models.Model):
- parent_data = models.IntegerField()
- self_data = models.ForeignKey('self', models.SET_NULL, null=True)
- class SelfRefChild(SelfRefParent):
- child_data = models.IntegerField()
- @python_2_unicode_compatible
- class Article(models.Model):
- headline = models.CharField(max_length=100)
- pub_date = models.DateTimeField()
- class Meta:
- ordering = ('-pub_date', 'headline')
- def __str__(self):
- return self.headline
- class ArticleWithAuthor(Article):
- author = models.CharField(max_length=100)
- class M2MBase(models.Model):
- articles = models.ManyToManyField(Article)
- class M2MChild(M2MBase):
- name = models.CharField(max_length=50)
- class Evaluation(Article):
- quality = models.IntegerField()
- class Meta:
- abstract = True
- class QualityControl(Evaluation):
- assignee = models.CharField(max_length=50)
- @python_2_unicode_compatible
- class BaseM(models.Model):
- base_name = models.CharField(max_length=100)
- def __str__(self):
- return self.base_name
- @python_2_unicode_compatible
- class DerivedM(BaseM):
- customPK = models.IntegerField(primary_key=True)
- derived_name = models.CharField(max_length=100)
- def __str__(self):
- return "PK = %d, base_name = %s, derived_name = %s" % (
- self.customPK, self.base_name, self.derived_name)
- class AuditBase(models.Model):
- planned_date = models.DateField()
- class Meta:
- abstract = True
- verbose_name_plural = 'Audits'
- class CertificationAudit(AuditBase):
- class Meta(AuditBase.Meta):
- abstract = True
- class InternalCertificationAudit(CertificationAudit):
- auditing_dept = models.CharField(max_length=20)
- # Abstract classes don't get m2m tables autocreated.
- @python_2_unicode_compatible
- class Person(models.Model):
- name = models.CharField(max_length=100)
- class Meta:
- ordering = ('name',)
- def __str__(self):
- return self.name
- @python_2_unicode_compatible
- class AbstractEvent(models.Model):
- name = models.CharField(max_length=100)
- attendees = models.ManyToManyField(Person, related_name="%(class)s_set")
- class Meta:
- abstract = True
- ordering = ('name',)
- def __str__(self):
- return self.name
- class BirthdayParty(AbstractEvent):
- pass
- class BachelorParty(AbstractEvent):
- pass
- class MessyBachelorParty(BachelorParty):
- pass
- # Check concrete -> abstract -> concrete inheritance
- class SearchableLocation(models.Model):
- keywords = models.CharField(max_length=256)
- class Station(SearchableLocation):
- name = models.CharField(max_length=128)
- class Meta:
- abstract = True
- class BusStation(Station):
- bus_routes = models.CommaSeparatedIntegerField(max_length=128)
- inbound = models.BooleanField(default=False)
- class TrainStation(Station):
- zone = models.IntegerField()
- class User(models.Model):
- username = models.CharField(max_length=30, unique=True)
- class Profile(User):
- profile_id = models.AutoField(primary_key=True)
- extra = models.CharField(max_length=30, blank=True)
- # Check concrete + concrete -> concrete -> concrete
- class Politician(models.Model):
- politician_id = models.AutoField(primary_key=True)
- title = models.CharField(max_length=50)
- class Congressman(Person, Politician):
- state = models.CharField(max_length=2)
- class Senator(Congressman):
- pass
|