【问题标题】:Populating django-taggit field with **kwargs / a string使用 **kwargs / 字符串填充 django-taggit 字段
【发布时间】:2023-04-05 04:10:01
【问题描述】:

我有一个自定义命令来使用 JSON 数据填充 Django 对象,该数据主要以我想要的方式工作,但我遇到了 django-taggit 字段的问题。解析完所有数据并以 JSON 格式输出后,我的 JSON 对象中的流派如下所示:

"genres": "latin pop, pop, singer-songwriter", 

django-taggit 采用逗号分隔的标签列表,这就是它。但是当我运行下面的自定义命令时,我的模型中的 genres = TaggableManager() 字段中没有任何内容。

import json
import dateparser
from django.db import IntegrityError
from django.core.management.base import BaseCommand, CommandError
from concerts.models import Concert, Venue


class Command(BaseCommand):
    help = "Load JSON concert data"

    def add_arguments(self, parser):
        parser.add_argument('concert_file', type=str)

    def handle(self, *args, **options):
        with open(options['concert_file']) as f:
            data = json.load(f)
        for concert in data:
            try:
                venue = Venue.objects.get(name=concert['venue'])
            except Venue.DoesNotExist:
                print "Can't find venue! " + concert['venue']
                pass
            del concert['venue']
            try:
                Concert.objects.create(venue=venue, **concert)
            except IntegrityError:
                print concert['slug'] + ": This concert already exists!"
                pass
                # if the slug unique contrainst fails, just pass this concert

我怎样才能让流派字段以我想要的方式填充?

【问题讨论】:

    标签: django django-taggit


    【解决方案1】:

    如果其他人遇到这个问题,这是我想出来的:

    class Command(BaseCommand):
    help = "Load JSON concert data"
    
    def add_arguments(self, parser):
        parser.add_argument('concert_file', type=str)
    
    def handle(self, *args, **options):
        with open(options['concert_file']) as f:
            data = json.load(f)
        for concert in data:
            try:
                venue = Venue.objects.get(name=concert['venue'])
            except Venue.DoesNotExist:
                print "Can't find venue! " + concert['venue']
                pass
            del concert['venue']
            try:
                Concert.objects.create(venue=venue, **concert)
                print concert['slug'] + ": Concert created!"
            except IntegrityError: # if slug already exists
                print concert['slug'] + ": This slug already exists!"
                pass
                # if the slug unique contrainst fails, just pass this concert
            try:
                new_concert = Concert.objects.get(slug=concert['slug'])
                genres = concert['genres'].split(", ")
                for genre in genres:
                    new_concert.genres.add(genre)
            except KeyError or AttributeError: # if no genres key exists
                pass
    

    如您所料,答案在文档中。我查看了 django-taggit 文档,特别是关于 API 的文档,然后在上面的最后一个 try/except 语句中添加了标准标记。

    这段代码的一个好处(对我来说)是即使音乐会已经存在,这段代码仍然会更新流派字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-21
      • 1970-01-01
      • 2018-05-15
      • 2011-07-11
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      相关资源
      最近更新 更多