Django之models database总结(四)

one-to-one 关系

定义一个one-to-one关系,使用OneToOneField,用起来和其他字段差不多。该字段需要一个位置参数用来指定要关系的model.
举个简单的例子:

from django.db import models

class Place(models.Model):
  name = models.CharField(max_length=50)
  address = models.CharField(max_length=80)
  def __str__(self): # __unicode__ on Python 2
    return "%s the place" % self.name 

class Restaurant(models.Model):
  place = models.OneToOneField(
    Place,
  on_delete=models.CASCADE,
    primary_key=True,
  )
  serves_hot_dogs = models.BooleanField(default=False)
  serves_pizza = models.BooleanField(default=False)
  def __str__(self): # __unicode__ on Python 2
    return "%s the restaurant" % self.place.name

class Waiter(models.Model):
  restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE)
  name = models.CharField(max_length=50)
  def __str__(self): # __unicode__ on Python 2
    return "%s the waiter at %s" % (self.name, self.restaurant)
 p1 = Place(name='Demon Dogs', address='944 W. Fullerton')
 p1.save()
 p2 = Place(name='Ace Hardware', address='1013 N. Ashland')
 p2.save()
 r = Restaurant(place=p1, serves_hot_dogs=True, serves_pizza=False)
 r.save()
 r.place

 p1.restaurant

 hasattr(p2, 'restaurant')
False
 r.place = p2
 r.save()
 p2.restaurant

 r.place

 p1.restaurant = r
 p1.restaurant

 p3 = Place(name='Demon Dogs', address='944 W. Fullerton')
 Restaurant.objects.create(place=p3, serves_hot_dogs=True, serves_pizza=False)
Traceback (most recent call last):
...
ValueError: save() prohibited to prevent data loss due to unsaved related object 'place'.
 Restaurant.objects.get(place=p1)

 Restaurant.objects.get(place__pk=1)

 Restaurant.objects.filter(place__name__startswith="Demon")
]>
 Restaurant.objects.exclude(place__address__contains="Ashland")
]>

 Place.objects.get(pk=1)

 Place.objects.get(restaurant__place=p1)

 Place.objects.get(restaurant=r)

 Place.objects.get(restaurant__place__name__startswith="Demon")


 w = r.waiter_set.create(name='Joe')
 w

 Waiter.objects.filter(restaurant__place=p1)
]>
 Waiter.objects.filter(restaurant__place__name__startswith="Demon")
]>

你可能感兴趣的:(Django之models database总结(四))