简体   繁体   English

将对象添加到许多关系

[英]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.

相关问题 如何将查询集添加到ManyToMany关系? - How to add queryset to ManyToMany relationship? 动态将ManyToMany关系添加到Django对象 - Dynamically add ManyToMany relationship to Django objects Django将ManyToMany关系添加到管理员用户表单 - Django Add ManyToMany Relationship to Admin User Form Django从单个对象过滤掉ManyToMany关系 - Django filter ManyToMany relationship from a single object 在ManyToMany关系中删除对象后保留数据 - Keep data after deleting object in ManyToMany relationship 在manyToMany模型中的Django关系,对象没有属性 - Django relationship in manyToMany models, object has no attribute Django获取ManyToMany关系的对象和关系字段 - Django get object and relation field of a ManyToMany Relationship 在可以使用这种多对多关系之前,在添加对象引发中使用ManyToMany字段需要为字段“ id”具有一个值 - Use ManyToMany field in add object raise needs to have a value for field “id” before this many-to-many relationship can be used Django 在保存方法中以多对多关系添加元素 - Django add element in manytomany relationship inside the save method Django中的多对多关系“添加朋友,删除朋友”不起作用 - ManyToMany Relationship "add-friend, remove-friend" in Django not working
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM