#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(), и это сработало, хотя я не знал об аргументах и части списка, это очень помогает, спасибо.