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
-~----------~----~----~----~------~----~------~--~---

Reply via email to