[英]Add object to to manytomany relationship
i'm trying to add ticker values to a currency object using a custom command, but i can't seem to be able to add the ticker to the CurrencyTickerSerializer
? 我正在尝试使用自定义命令将代码价值添加到货币对象,但似乎无法将代码添加到
CurrencyTickerSerializer
? i get following error TypeError: 'QuerySet' object does not support item assignment
. 我收到以下错误
TypeError: 'QuerySet' object does not support item assignment
。 I run this command in a specific interval that is suppose to add the ticker into the specific currency, but i guess i need to add something in order to being able to add the ticker into TickerSerializer
? 我在一个特定的间隔中运行此命令,该间隔应该将代码添加到特定货币中,但是我想我需要添加一些内容才能将代码添加到
TickerSerializer
?
Command 命令
class Command(BaseCommand):
def handle(self, *args, **options):
comparison='DKK'
url = 'URL'
page = requests.get(url)
data = page.json()
response_data = {}
for ticker in data:
currency = Currency.objects.filter(symbol=ticker['symbol'], is_active=True)
if currency.exists():
currency['tickers'] = ticker
serializer = CurrencyTickerSerializer(data=currency)
if serializer.is_valid():
serializer.save()
serializers 序列化器
class TickerSerializer(serializers.HyperlinkedModelSerializer):
currency = serializers.PrimaryKeyRelatedField(many=False, queryset=Currency.objects.all())
class Meta:
model = Ticker
fields = ('currency', 'rank', 'price_dkk', 'market_cap_dkk', 'percent_change_1h', 'percent_change_24h', 'percent_change_7d',)
class CurrencyTickerSerializer(serializers.HyperlinkedModelSerializer):
tickers = TickerSerializer(many=True)
class Meta:
model = Currency
fields = ('id', 'name','symbol', 'tickers', )
Models 楷模
class Ticker(models.Model):
rank = models.IntegerField()
price_dkk = models.DecimalField(max_digits=20, decimal_places=6)
market_cap_dkk = models.BigIntegerField()
percent_change_1h = models.DecimalField(max_digits=4, decimal_places=2)
percent_change_24h = models.DecimalField(max_digits=4, decimal_places=2)
percent_change_7d = models.DecimalField(max_digits=4, decimal_places=2)
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
verbose_name_plural = _('Ticker')
def __str__(self):
return self.id
class Currency(models.Model):
symbol = models.CharField(max_length=4, default='BTC', unique=True)
name = models.CharField(max_length=20, default='Bitcoin', unique=True)
img = models.ImageField(upload_to = 'static/img/currencies', blank=True)
is_active = models.BooleanField(default=False)
tickers = models.ManyToManyField(Ticker)
class Meta:
verbose_name_plural = 'currencies'
def __str__(self):
return self.name
let review your code where is this problem . 让我们回顾一下您的代码在哪里出问题。
class Command(BaseCommand):
def handle(self, *args, **options):
comparison='DKK'
url = 'URL'
page = requests.get(url)
data = page.json()
response_data = {}
for ticker in data:
currency = Currency.objects.filter(symbol=ticker['symbol'], is_active=True)
if currency.exists():
currency['tickers'] = ticker
serializer = CurrencyTickerSerializer(data=currency)
if serializer.is_valid():
serializer.save()
your code is working until currency['tickers'] = ticker
you treat a class as array.use currency.tickers.add(ticker)
instate . 您的代码将一直运行,直到
currency['tickers'] = ticker
将类视为array.use currency.tickers.add(ticker)
instate为止。 it will work but not in your case because add function will complain about argument . 它会起作用,但不适用于您的情况,因为add函数会抱怨参数。 it's need a instance
Ticker
class not json data . 它需要一个实例
Ticker
类而不是json data。 so know 这样知道
for ticker in data:
currency = Currency.objects.filter(symbol=ticker['symbol'], is_active=True)
if currency.exists():
tickers = Ticker(...)
currency.tickers.add(tickers)
serializer = CurrencyTickerSerializer(data=currency)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.