On 5/7/2009 8:05 AM, Lee Hinde wrote: > On Wed, May 6, 2009 at 11:37 PM, George Song <geo...@damacy.net> wrote: >> On 5/6/2009 11:18 PM, Lee Hinde wrote: >>> On Wed, May 6, 2009 at 11:15 PM, Lee Hinde <leehi...@gmail.com> wrote: >>>> On Wed, May 6, 2009 at 10:54 PM, George Song <geo...@damacy.net> wrote: >>>>> On 5/6/2009 10:34 PM, Lee Hinde wrote: >>>>>> On Wed, May 6, 2009 at 10:22 PM, George Song <geo...@damacy.net> wrote: >>>>>>> On 5/6/2009 9:57 PM, Lee Hinde wrote: >>>>>>>> I have this as part of the model for a class called "Class" >>>>>>>> >>>>>>>> >>>>>>>> def save(self, force_insert=False, force_update=False): >>>>>>>> start = defaultfilters.slugify(self.Name) >>>>>>>> count = Class.objects.filter(Slug__equal=start).count() >>>>>>>> if count != 0: >>>>>>>> filterme = "%s_%d" % (self.Name, count) >>>>>>>> self.Slug = defaultfilters.slugify(filterme) >>>>>>>> else: >>>>>>>> self.Slug = start >>>>>>>> >>>>>>>> >>>>>>>> The reason is, it's ok to have duplicate Names, and I want to use a >>>>>>>> Slug as the canonical url. >>>>>>>> >>>>>>>> I have a bunch of data to import and so , in shell I run >>>>>>>> >>>>>>>> c = Class.objects.all() >>>>>>>> for o in c: >>>>>>>> o.save() >>>>>>>> >>>>>>>> >>>>>>>> My goal would be to see something like: >>>>>>>> >>>>>>>> yoga-for-kids >>>>>>>> yoga-for-kids_1 >>>>>>>> yoga-for-kids_2 >>>>>>>> >>>>>>>> What's weird is I'm getting: >>>>>>>> >>>>>>>> yoga-for-kids >>>>>>>> yoga-for-kids >>>>>>>> yoga-for-kids_2 >>>>>>>> >>>>>>>> i.e., I get dupes and then not. >>>>>>>> hasn't >>>>>>>> I've played with it most of the evening and now I'm hoping someone >>>>>>>> with a fresh pair of eyes might have a suggestion. >>>>>>>> >>>>>>>> Thanks in advance. >>>>>>> I'm not sure why you're getting yoga-for-kids_2, what I expect is >>>>>>> yoga-for-kids, yoga-for-kids_1, then more yoga-for-kids_1 if your slug >>>>>>> field is not unique=True. >>>>>>> >>>>>>> In any case, your logic will keep generating yoga-for-kids_1 because >>>>>>> there will only ever be one count for yoga-for-kids in your DB. >>>>>>> >>>>>> Well, depends on when it's run, right? yoga-for-kids_1 would be the >>>>>> correct response for the 2nd record. >>>>>> >>>>>> In this case I'm updating imported data, so there's a pre-existing >>>>>> match. If it's a new record, it should come back zero, sine the record >>>>>> hasn't been saved yet? >>>>>> >>>>>> Thanks for looking at it. >>>>> Well, I imagine your Class.Name for your test case is "Yoga For Kids", >>>>> right? >>>>> >>>>> So your `start` is always going to be "yoga-for-kids" no matter what. >>>>> >>>>> Since you're search on that slug, you should only ever have one record >>>>> since your slugs are supposed to be unique. So your re-generated slug >>>>> will always be "yoga-for-kids_1". >>>>> >>>>> -- >>>>> George >>>>> >>>> Yes, I see what you're saying and it means I've left out a step. >>>> Before I run the model.save() loop, I clear the existing slug data, so >>>> it starts clean each run. >>>> >>> But still should always leave me with 1... So, how did I end up with 2 >>> blanks and one 2? >>> >>> Assuming I start off with blanks. >>> >>> First time - no match, save as is >>> Second time - one match save as X_1 >>> third time, still one match (this is what you described), should save >>> again as x_1 (I'd tried 'startedwith' but that had other problems.) >> I can't be sure what your exact conditions are, but in my test, the >> result is exactly as I described: >> >> {{{ >> from django.db import models >> from django.template.defaultfilters import slugify >> >> class Class(models.Model): >> name = models.CharField(max_length=50) >> slug = models.SlugField() >> >> def save(self, force_insert=False, force_update=False): >> self.slug = slugify(self.name) >> count = self.__class__.objects.filter(slug=self.slug).count() >> if count: >> self.slug = '%s_%d' %(self.slug, count) >> super(Class, self).save(force_insert, force_update) >> >> >>> from yoga.models import Class >> >>> c1 = Class.objects.create(name='Yoga For Kids') >> >>> c2 = Class.objects.create(name='Yoga For Kids') >> >>> c3 = Class.objects.create(name='Yoga For Kids') >> >>> c1.slug >> u'yoga-for-kids' >> >>> c2.slug >> u'yoga-for-kids_1' >> >>> c3.slug >> u'yoga-for-kids_1' >> }}} >> >> -- >> George > > > George, thanks very much for the effort. > > I'd appreciate any suggestions on the right way to code this.
I would probably define a utility function that generically accepts a list of current slugs and the slug that you want, and returns a unique slug. In the function body would be whatever logic you want to use to make that slug unique, among all the slugs for a specific model. {{{ def make_unique_slug(all_slugs, slug): if slug in all_slugs: # Do your magic here to make it unique return slug }}} -- George --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-users@googlegroups.com To unsubscribe from this group, send email to django-users+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/django-users?hl=en -~----------~----~----~----~------~----~------~--~---