Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>Yo guys,</p> <p>I managed to make what I wanted.</p> <p>First, I created a new field:</p> <pre><code>from django.db.models.deletion import DO_NOTHING from django.db.models.fields.related import ForeignKey, ManyToOneRel class SoftForeignKey(ForeignKey): """ This field behaves like a normal django ForeignKey only without hard database constraints. """ def __init__(self, to, to_field=None, rel_class=ManyToOneRel, **kwargs): ForeignKey.__init__(self, to, to_field=to_field, rel_class=rel_class, **kwargs) self.on_delete = DO_NOTHING no_db_constraints = True </code></pre> <p>Since I use South to manage my database schema, I had to add this:</p> <pre><code>from south.modelsinspector import add_introspection_rules add_introspection_rules([], [r'^ecm\.lib\.softfk\.SoftForeignKey']) </code></pre> <p>Then, I had to monkey patch south so that it takes the <code>no_db_constraints</code> parameter into account. There were two functions involved in the creation of FK constraints: </p> <pre><code>from django.db.models.deletion import DO_NOTHING from django.db.models.fields.related import ForeignKey, ManyToOneRel from django.core.management.color import no_style from south.db.generic import DatabaseOperations, invalidate_table_constraints, flatten def column_sql(self, table_name, field_name, field, tablespace='', with_name=True, field_prepared=False): """ Creates the SQL snippet for a column. Used by add_column and add_table. """ # If the field hasn't already been told its attribute name, do so. ... ... ... if field.rel and self.supports_foreign_keys: # HACK: "soft" FK handling begin if not hasattr(field, 'no_db_constraints') or not field.no_db_constraints: self.add_deferred_sql( self.foreign_key_sql( table_name, field.column, field.rel.to._meta.db_table, field.rel.to._meta.get_field(field.rel.field_name).column ) ) # HACK: "soft" FK handling end # Things like the contrib.gis module fields have this in 1.1 and below if hasattr(field, 'post_create_sql'): for stmt in field.post_create_sql(no_style(), ta .... .... # monkey patch South here DatabaseOperations.column_sql = column_sql </code></pre> <p>And:</p> <pre><code>from django.db.models.deletion import DO_NOTHING from django.db.models.fields.related import ForeignKey, ManyToOneRel from django.core.management.color import no_style from south.db.generic import DatabaseOperations, invalidate_table_constraints, flatten @invalidate_table_constraints def alter_column(self, table_name, name, field, explicit_name=True, ignore_constraints=False): """ Alters the given column name so it will match the given field. Note that conversion between the two by the database must be possible. Will not automatically add _id by default; to have this behavour, pass explicit_name=False. @param table_name: The name of the table to add the column to @param name: The name of the column to alter @param field: The new field definition to use """ if self.dry_run: if self.debug: ... ... if not ignore_constraints: # Add back FK constraints if needed if field.rel and self.supports_foreign_keys: # HACK: "soft" FK handling begin if not hasattr(field, 'no_db_constraints') or not field.no_db_constraints: self.execute( self.foreign_key_sql( table_name, field.column, field.rel.to._meta.db_table, field.rel.to._meta.get_field(field.rel.field_name).column ) ) # HACK: "soft" FK handling end # monkey patch South here DatabaseOperations.alter_column = alter_column </code></pre> <p>This is really ugly but I didn't find another way. </p> <p>Now you can use the SoftForeignKey field exactly like a normal ForeignKey except that you won't have any referencial integrity enforcement.</p> <p>See here for the complete monkey-patch : <a href="http://eve-corp-management.org/projects/ecm/repository/entry/ecm/lib/softfk.py" rel="nofollow">http://eve-corp-management.org/projects/ecm/repository/entry/ecm/lib/softfk.py</a></p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload