首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >现有对象Django上的OneToMany

现有对象Django上的OneToMany
EN

Stack Overflow用户
提问于 2019-01-12 00:40:36
回答 1查看 104关注 0票数 0

我正在进行实验,以便更好地了解Django是如何工作的。下面的测试函数创建一个类别、标记和表示Macbook Pros的Item,然后将Macbook Pro添加到该类别、标记和项目(产品)中。

相关模型:(注意:我正在进行故障排除,模型可能不完全代表问题发生时的情况)

代码语言:javascript
复制
class Tag(models.Model):
    title = models.CharField(max_length=20)

    def __str__(self):
        return self.title

class Item(models.Model):
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=100)
    manufacturer = models.ForeignKey('Manufacturer', blank=True, null=True, on_delete=models.SET_NULL)
    introduction = models.DateField(auto_now=True)
    quanity = models.IntegerField(default=0)
    is_retired = models.BooleanField(default=False)
    tags = models.ManyToManyField(Tag)

    def __str__(self):
        return self.name

    def add(self):
        pass

    def remove(self):
        pass

    def retire(self): # Rex came up with this, roll credits.
        pass 

    def count(self):
        pass

class OnHand(models.Model):
    name = models.CharField(max_length=100)
    serial = models.CharField(max_length=80)
    asset = models.CharField(max_length=20)
    product = models.ForeignKey(Item, blank=True, null=True, on_delete=models.CASCADE)


    def __str__(self):
        return self.serial

测试用例:

代码语言:javascript
复制
def make_macbook():
    """ Create a Manufacturer for Apple """
    apple = Manufacturer(name='Apple', rep_name='Jason Wilburn', support_number='1-800-Apple')
    apple.save()
    print('Manufacturer name: {}'.format(apple))

    """ Create a Category for Laptops """
    laptop = Category(name='Laptops')
    laptop.save()
    print('Category name: {}'.format(laptop))

    """ Create a Tag for Mac """
    mac = Tag(title='mac')
    mac.save()
    print('Tag name: {}'.format(mac))

    """ Create a MacBook Item """
    macbook = Item(name='Macbook Pro', description='15.5" Macbook Pro, 2018 Model', manufacturer=apple)
    macbook.save()
    print('Item name: {}'.format(macbook))

    """ Create a MacBook OnHand item """
    newMac = OnHand(name='MacBook Pro 15.5"', serial='SC02XP0NRJGH5', asset='DEPSC02XP0NRJGH5', product=macbook)
    newMac.save()


    return newMac.product

我现在测试的是将新的OnHand对象添加到类别、标记和项中。

以下是我所拥有的:

代码语言:javascript
复制
def add_macbook():
    """ Find MacBook Item """
    macbook = Item.objects.filter(name='Macbook Pro')

    """ Create a MacBook OnHand item """
    newMac = OnHand(name='MacBook Pro 15.5"', serial='000000000000000', asset='DEP0000000000000', product=macbook)
    newMac.save()

我面临两个问题:

  1. 类“Item”没有“objects”成员
  2. ValueError:无法分配"]>":"OnHand.product“必须是"Item”实例。

如何将现有的实例关联起来?

我也尝试过:

代码语言:javascript
复制
def add_macbook():
    """ Find MacBook Item """
    macbook = Item.objects.get(name='Macbook Pro')

    """ Create a MacBook OnHand item """
    newMac = OnHand(name='MacBook Pro 15.5"', serial='000000000000000', asset='DEP0000000000000')
    newMac.save()
    macbook.product.add(newMac)

它向我展示了一个显而易见的'Item‘没有属性'product’,因为它显然没有。我尝试这是因为我的Tag模型是如何工作的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-12 03:30:33

.filter()函数返回一个查询集,而不是单个模型实例,您不能将整个查询集指定为外键。另一方面,.get()将返回一个模型实例。你几乎有了正确的组合。试试这个:

代码语言:javascript
复制
def add_macbook():
    """ Find MacBook Item """
    macbook = Item.objects.get(name='Macbook Pro')


    """ Create a MacBook OnHand item """
    newMac = OnHand(
        name='MacBook Pro 15.5"',
        serial='000000000000000',
        asset='DEP0000000000000',
        product=macbook
    )
    newMac.save()

Class 'Item' has no 'objects' member错误对我来说毫无意义。这可能只是IDE警告吗?

下面是过滤器函数的链接

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54155789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档