models.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. from django.contrib.auth.models import User
  2. from django.contrib.contenttypes.fields import (
  3. GenericForeignKey, GenericRelation,
  4. )
  5. from django.contrib.contenttypes.models import ContentType
  6. from django.db import models
  7. class Review(models.Model):
  8. source = models.CharField(max_length=100)
  9. content_type = models.ForeignKey(ContentType, models.CASCADE)
  10. object_id = models.PositiveIntegerField()
  11. content_object = GenericForeignKey()
  12. class Meta:
  13. ordering = ('source',)
  14. def __str__(self):
  15. return self.source
  16. class PersonManager(models.Manager):
  17. def get_by_natural_key(self, name):
  18. return self.get(name=name)
  19. class Person(models.Model):
  20. name = models.CharField(max_length=100)
  21. objects = PersonManager()
  22. class Meta:
  23. ordering = ('name',)
  24. def __str__(self):
  25. return self.name
  26. # This book manager doesn't do anything interesting; it just
  27. # exists to strip out the 'extra_arg' argument to certain
  28. # calls. This argument is used to establish that the BookManager
  29. # is actually getting used when it should be.
  30. class BookManager(models.Manager):
  31. def create(self, *args, extra_arg=None, **kwargs):
  32. return super().create(*args, **kwargs)
  33. def get_or_create(self, *args, extra_arg=None, **kwargs):
  34. return super().get_or_create(*args, **kwargs)
  35. class Book(models.Model):
  36. title = models.CharField(max_length=100)
  37. published = models.DateField()
  38. authors = models.ManyToManyField(Person)
  39. editor = models.ForeignKey(Person, models.SET_NULL, null=True, related_name='edited')
  40. reviews = GenericRelation(Review)
  41. pages = models.IntegerField(default=100)
  42. objects = BookManager()
  43. class Meta:
  44. ordering = ('title',)
  45. def __str__(self):
  46. return self.title
  47. class Pet(models.Model):
  48. name = models.CharField(max_length=100)
  49. owner = models.ForeignKey(Person, models.CASCADE)
  50. class Meta:
  51. ordering = ('name',)
  52. def __str__(self):
  53. return self.name
  54. class UserProfile(models.Model):
  55. user = models.OneToOneField(User, models.SET_NULL, null=True)
  56. flavor = models.CharField(max_length=100)
  57. class Meta:
  58. ordering = ('flavor',)