OneToMany на существующий объект Django - PullRequest
0 голосов
/ 12 января 2019

Я экспериментирую, чтобы получить лучшее представление о том, как работает Django. Возьмите тестовую функцию, описанную ниже, которая создает категорию, тег и элемент , представляющий MacBook Pro , затем добавляет Macbook Pro к этой категории, тегу и элементу (продукту). ).

Соответствующие модели: (Обратите внимание, что я нахожусь в процессе устранения неполадок, модели могут не совсем точно представлять, что они были на момент вопроса)

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

Контрольные примеры:

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 объектов в Category, Tag и Item .

Вот что у меня есть:

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()

Я сталкиваюсь с 2 проблемами:

  1. Класс «Элемент» не имеет члена «objects»
  2. ValueError: Невозможно назначить "]>": "OnHand.product" должен быть экземпляром "Item".

Как мне связать существующий экземпляр Item ?

Я также пробовал:

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)

Что дает мне очевидное «Элемент» не имеет атрибута «product» , потому что, очевидно, его нет. Я попробовал это из-за того, как работает моя Tag модель.

1 Ответ

0 голосов
/ 12 января 2019

Функция .filter() возвращает набор запросов, а не отдельный экземпляр модели, и вы не можете назначить весь набор запросов в качестве внешнего ключа. С другой стороны, .get() вернет один экземпляр модели. У тебя почти была правильная комбинация. Попробуйте это:

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?

Вот ссылка для функции фильтра.

...