def get_tags(tags, create=False, str_pk=False): if isinstance(tags, (str, unicode)): tags = parse_tags(tags) tag_set = set() names = set() tag_lookups = set() for tag in tags: if isinstance(tag, Tag): tag_set.add(tag) if create and not tag.pk: tag.save() elif isinstance(tag, basestring): try: tag_lookups.add(models.Q(pk=int(tag))) except ValueError: if create: names.add(tag) tag_lookups.add(models.Q(name=tag)) elif isinstance(tag, (int, long)): tag_lookups.add(models.Q(pk=tag)) if tag_lookups: for tag in Tag.objects.filter(reduce_or(tag_lookups)): tag_set.add(tag) for name in names.difference(tag.name for tag in tag_set): tag_set.add(Tag.objects.create(name=name)) return tag_set
def assign(self, tags): if isinstance(tags, (str, unicode)): tags = parse_tags(tags) self.clear() self.add(*tags)