Менеджеры Django Custom для модели User

Похоже, что это очень сложно и требует глубоких знаний физики, но на самом деле это очень просто, вам нужно знать только 2 формулы и базовое понимание векторов:

Сила притяжения (или гравитационная сила) между планетой 1 и планетой 2 с массой m1 и m2 и расстоянием между ними d: Fg = G * m1 * m2 / d ^ 2; Fg = m * a. G - это константа, найдите ее, подставив случайные значения, чтобы ускорение «а» не было слишком маленьким и не слишком большим, приблизительно «0,01» или «0,1».

Если у вас есть общая векторная сила, которая действует на текущую планету в этот момент времени, вы можете найти мгновенное ускорение a = (общая сила) / (масса текущей планеты). А если у вас есть текущее ускорение, текущая скорость и текущая позиция, вы можете найти новую скорость и новую позицию

Если вы хотите выглядеть реально, вы можете использовать следующий сверхлегкий алгоритм (псевдокод):

int n; // # of planets
Vector2D planetPosition[n]; 
Vector2D planetVelocity[n]; // initially set by (0, 0)
double planetMass[n];

while (true){
    for (int i = 0; i < n; i++){
        Vector2D totalForce = (0, 0); // acting on planet i
        for (int j = 0; j < n; j++){
            if (j == i)
                continue; // force between some planet and itself is 0
            Fg = G * planetMass[i] * planetMass[j] / distance(i, j) ^ 2;
        // Fg is a scalar value representing magnitude of force acting
        // between planet[i] and planet[j]
        // vectorFg is a vector form of force Fg
        // (planetPosition[j] - planetPosition[i]) is a vector value
        // (planetPosition[j]-planetPosition[i])/(planetPosition[j]-plantetPosition[i]).magnitude() is a
        // unit vector with direction from planet[i] to planet[j]
            vectorFg = Fg * (planetPosition[j] - planetPosition[i]) / 
                  (planetPosition[j] - planetPosition[i]).magnitude();
            totalForce += vectorFg;
        }
        Vector2D acceleration = totalForce / planetMass[i];
        planetVelocity[i] += acceleration;
    }

    // it is important to separate two for's, if you want to know why ask in the comments
    for (int i = 0; i < n; i++)
        planetPosition[i] += planetVelocity[i];

    sleep 17 ms;
    draw planets;
}
9
задан Dominic Rodger 29 October 2009 в 10:34
поделиться

2 ответа

Да, вы можете добавить настраиваемый менеджер напрямую в класс User. Это обезьяна, и она делает ваш код менее удобным в обслуживании (кто-то, пытающийся выяснить ваш код, может не знать, где класс User получил этот настраиваемый менеджер или где они могли бы его найти). В данном случае это относительно безвредно, поскольку вы фактически не переопределяете какое-либо существующее поведение класса User, а просто добавляете что-то новое.

from django.contrib.auth.models import User
User.add_to_class('clients', ClientsManager())

Если вы используете Django 1.1+, вы также можете создать подкласс User с прокси модель ; не влияет на базу данных, но позволит вам подключать дополнительных менеджеров без monkeypatch.

18
ответ дан 4 December 2019 в 13:03
поделиться

You can user Profile for this

AUTH_PROFILE_MODULE = 'accounts.UserProfile'

When a user profile model has been defined and specified in this manner, each User object will have a method -- get_profile() -- which returns the instance of the user profile model associated with that User.

Or you can write your own authenticate backend. Added it in settings

-2
ответ дан 4 December 2019 в 13:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: