你如何在Django中获得OneToOneField和ManyToManyField相关的字段?

时间:2016-12-21 01:53:37

标签: python django django-models django-orm

如何在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'等于'示例'等字符串,它是如何完成的?

2 个答案:

答案 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属性轻松访问ab
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)

一般来说,为模型及其属性提供更具描述性的名称,或者至少添加解释这些模型所代表的内容的评论