Я пытаюсь преобразовать ForeignKey в GenericForeignKey в django. Я планирую сделать это в три миграции, mig1, mig2, mig3.
Миграция 1 (mig1) имеет следующий код
class Migration(migrations.Migration):
dependencies = [
('contenttypes', '0002_remove_content_type_name'),
('post_service', '0008_auto_20180802_1112'),
]
operations = [
migrations.AddField(
model_name='comment',
name='content_type',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType'),
),
migrations.AddField(
model_name='comment',
name='object_id',
field=models.PositiveIntegerField(null=True),
),
]
Миграция 2 (mig2) имеет следующий код
def change_posts_to_generic_key_comment(apps, schema_editor):
Comment = apps.get_model('post_service', 'Comment')
db_alias = schema_editor.connection.alias
comments = Comment.objects.using(db_alias).all()
for comment in comments:
Comment.objects.filter(id=comment.id).update(content_object=comment.post)
def reverse_change_posts_to_generic_key_comment(apps, schema_editor):
Comment = apps.get_model('post_service', 'Comment')
db_alias = schema_editor.connection.alias
comments = Comment.objects.using(db_alias).all()
for comment in comments:
Comment.objects.filter(id=comment.id).update(content_object=)
class Migration(migrations.Migration):
dependencies = [
('post_service', '0009_auto_20180802_1623'),
]
operations = [
migrations.RunPython(change_posts_to_generic_key_comment, reverse_change_posts_to_generic_key_comment),
]
Я пытался использовать как обновление, так и прямое назначение объекта
comment.content_object = content.post
, а затем comment.save()
ни один из них не работает. Как обновить общее поле внешнего ключа.
Один из способов — вручную установить content_type
и object_id
. Есть ли лучший способ сделать это?
EDIT: Модель комментария
class Comment(models.Model):
post = models.ForeignKey(Post,on_delete=models.CASCADE)
# Fields for generic relation
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE, null=True)
object_id = models.PositiveIntegerField(null=True)
content_object = GenericForeignKey()
apps.get_model
, которая является представлением класса модели в какой-то момент истории. Но ТБХ, я понятия не имею. Я надеюсь изучить это подробнее, когда у меня будет больше времени. Удалось обойти это, установивcontent_type_id
иobject_id
непосредственно в миграции. - person Craig Anderson   schedule 22.02.2019