Настройка значений полей для объекта M2M в djnago

#python #django #model

#python #django #Модель

Вопрос:

В моем приложении есть две модели, и я пытаюсь обновить поле M2M. В документации Django говорится, что это можно сделать с помощью метода set() . Но я предполагаю, что по dealed set() принимает pk объектов в качестве аргументов, и то, что я хочу сделать, это установить его, используя фактические значения.

Например, у меня есть клиент в моделях клиентов с именем «adam», и я хочу установить значение для соответствующего поля M2M «items_onsale» в [«ac», «book»]

Ниже приведен мой код для моделей :-

 from django.db import models


class Client(models.Model):
    SEX_CHOICES = [('M', 'Male'), ('F', 'Female')]
    fname = models.CharField(max_length=100)
    lname = models.CharField(max_length=100)
    mailid = models.EmailField(max_length=100)
    sex = models.CharField(max_length=1, choices=SEX_CHOICES, blank=True)
    age = models.IntegerField()
    items_onsale = models.ManyToManyField('Sinfo', blank=True)

    def __str__(self):  # for displaying the variable correctly.
        return self.fname , self.lname , self.mailid , self.sex , self.age , self.items_onsale


class Sinfo(models.Model):  # data of items put on sale by clients
    iname = models.CharField(max_length=100)
    idesc = models.TextField(max_length=300, null=True)

    def __str__(self):  # for displaying the variable correctly.
        return self.iname


  

То, что я пробовал до сих пор, это :-

 
c = Client.objects.get(pk=17)
list=["ac","book"]
c.items_onsale_set(list)

  

И я получаю ошибку ниже :-

Ошибка значения: поле ‘id’ ожидало число, но получило ‘book’

Я знаю, что есть способ обновить его, используя значения, но не уверен, как это сделать. Документация django предлагает использовать опцию «through_defaults», но не привела ни одного такого примера, поэтому я совершенно не уверен, как ее использовать :-

Для отношений «многие ко многим» set() принимает список либо экземпляров модели, либо значений полей, обычно первичных ключей, в качестве аргумента objs.

При необходимости используйте аргумент through_defaults для указания значений для новых экземпляров промежуточной модели. Вы можете использовать вызываемые объекты в качестве значений в словаре through_defaults, и они будут оцениваться один раз перед созданием любых промежуточных экземпляров.

Я уверен, что есть лучший способ добиться этого, пожалуйста, дайте мне знать.

Комментарии:

1. Существует ошибка ввода, это :- c.items_onsale.set(список)

Ответ №1:

опция through_defaults работает, если у вас есть несколько внешних ключей в одной модели при использовании опции through. в вашем случае items_onsale напрямую связан с клиентом, используйте функцию add вместо set .

 c = Client.objects.get(pk=17)
list=["ac","book"]
c.items_onsale.set(list)
  

Для

  c = Client.objects.get(pk=17)
 list= Sinfo.objects.filter(iname__in=["ac","book"])
 c.items_onsale.add(*list)
  

add() принимает произвольное количество аргументов, а не их список.
Чтобы расширить этот список до аргументов, используйте *

Комментарии:

1. Да, позже я использовал add(), и это сработало, хотя я не знал об аргументах и части списка, это очень помогает, спасибо.