如何在Django中获得OneToOneField和ManyToManyField相关的字段?
例如,
class A(models.Model):
myfield = models.CharField()
as = models.ManyToManyField('self')
class B(models.Model):
a = models.OneToOneField(A)
如果我想得到一个“myfield”'和所有相关的' as'使用B级,给出了一个' myfield'等于'示例'等字符串,它是如何完成的?
答案 0 :(得分:0)
<强> Models.py 强>
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
让我们创建一个场所实例。
p1 = Place.objects.create(name='Demon Dogs', address='944 W. Fullerton')
然后创建一个餐馆对象。
r = Restaurant.objects.create(place=p1, serves_hot_dogs=True, serves_pizza=False)
现在,从餐厅访问地点:
>>> r.place
<Place: Demon Dogs the place>
反之亦然从地方访问餐厅
>>> p1.restaurant
<Restaurant: Demon Dogs the restaurant>
我不明白多对多的字段部分你能详细说明吗?
答案 1 :(得分:0)
首先,您获得B说b
的实例,然后您可以通过myfield
as
属性轻松访问a
和b
b.a.myfield
b.a.as.all()
此外,CharField
需要max_length属性,如下所示:
class A(models.Model):
myfield = models.CharField(max_length=128)
as = models.ManyToManyField('self')
class B(models.Model):
a = models.OneToOneField(A)
一般来说,为模型及其属性提供更具描述性的名称,或者至少添加解释这些模型所代表的内容的评论