On Mon, Aug 8, 2011 at 3:06 PM, Chintan Tank <tankchin...@gmail.com> wrote:
> (sorry for duplicate I have already posted on stackoverflow.com >
> http://goo.gl/I7Jj6 )
>
> I need to perform a datamigration of a model Answer in app Question.
> In that script there is a dependency such that I need to create an
> instance of a model Chapter which is in the app Journal. So, I coded
> it as follows:
>
> def forwards(self, orm):
>    for answer_object in orm.Answer.objects.all():
>
>        #This Works.
>        blog, is_created =
> orm['blog.Post'].objects.get_or_create(title=answer_object.answer[:
> 100])
>        blog.save()
>
>        #This DOES NOT work
>        chapter, is_created =
> orm['journal.Chapter'].objects.get_or_create(content_object=blog)
>        chapter.save()
>        #cleanup task, not relevant to this question below
>        answer_object.chapter_ptr = chapter
>        answer_object.save()
>
>
>
> But as expected this throws an error on "
> orm['journal.Chapter'].objects.get_or_create(content_object=blog)"
> saying that > django.core.exceptions.FieldError: Cannot resolve
> keyword 'content_object' into field.
>
> This is presumably due to content_object being a GenericForeignKey so
> some operations are not allowed. But I also tried other alternatives
> for creating the "chapter" object like,
>
> chapter = orm['journal.Chapter'](content_object=blog)
> ERROR > TypeError: 'content_object' is an invalid keyword argument for
> this function
>
> and
>
> chapter = orm.journal.Chapter(content_object=blog)
> ERROR > AttributeError: The model 'journal' from the app 'questions'
> is not available in this migration. (Did you use orm.ModelName, not
> orm['app.ModelName']?)
>
> So since my earlier approach was failing I tried a new tact. The model
> whose instantiation was failing in my code above i.e. Chapter in the
> Journal app, I decided to create a datamigration for that instead. I
> also made sure to --freeze the models I am referring to in the
> forwards definition. Now this should have been straight forward, I
> would think. I have my forward code as follows -
>
> def forwards(self, orm):
>
>    for answer_object in orm['questions.Answer'].objects.all():
>
>        #Works, AGAIN!
>        blog, is_created =
> orm['blog.Post'].objects.get_or_create(title=answer_object.answer[:
> 100])
>        blog.save()
>
>        # DOES NOT WORK, AGAIN!
>        chapter = orm.Chapter(rank=1, content_object=blog)
>        chapter.save()
>
>
> I would have thought that now since I am creating instance of a model
> (Chapter) which exists in the subject app (Journal) everything should
> have worked out. But i am getting the same error > TypeError:
> 'content_object' is an invalid keyword argument for this function.
>
> It fails at the same point, namely, "content_object". I will post
> below the model definition if that might help.
>
> class Chapter(models.Model):
>
>    rank = models.IntegerField()
>
>    content_type = models.ForeignKey(ContentType)
>    object_id = models.PositiveIntegerField()
>    content_object = generic.GenericForeignKey()
>
> Also all the models being touched in these forwards methods, namely -
> blog, chapter, questions; are fully defined in the 00n_*.py files
> created by South's schemamigration.
>

content_object isn't a 'real' field, it is some magic applied to the
ORM and your model. The real fields are object_id and content type, so
use them directly.

Use ContentType.objects.get_for_model() [1] to get the content type.

[1] 
https://docs.djangoproject.com/en/1.3/ref/contrib/contenttypes/#django.contrib.contenttypes.models.ContentTypeManager.get_for_model

Cheers

Tom

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